在Python中循环遍历一个布尔数组,并用另一个数组中的元素替换真值。

3
假设我有一个类似以下的Numpy数组真值数组:
truths = [True, False, False, False, True, True]

我有另一个数值数组,大致如下:

nums = [1, 2, 3]

我想创建一个循环,用nums数组中的下一个数字替换truths数组中的所有真值,用0替换所有假值。
我希望最终呈现的结果如下:
array = [1, 0, 0, 0, 2, 3]

truths中的Truesnums中的数字多时会发生什么? - Billy Hudson
3个回答

3
我建议使用numpy.putmask()。由于我们要从bool类型转换为int64类型,因此需要进行一些转换。

首先,进行初始化:

truths = np.array([ True, False, False, False,  True,  True])
nums = np.array([1, 2, 3])

然后,我们根据我们的掩码进行转换和替换(如果truth中的元素为True):

truths = truths.astype('int64') # implicitly changes all the "False" values to 0
numpy.putmask(truths, truths, nums)

最终结果:
>>> truths
array([1, 0, 0, 0, 2, 3])

请注意,我们只是将 truths 传递到 numpy.putmask() 的“mask”参数中。这将简单地检查数组 truths 中的每个元素是否为真; 因为我们将数组转换为类型 int64,所以它将替换仅非0的元素,如所需。
如果我们想要更加严谨一些,或者需要替换某些任意值,则需要使用 numpy.putmask(truths, truths==<value we want to replace>, nums)
如果我们想要更加严谨,并且不做出易于类型转换的假设(例如从 bool 转换为 int64),据我所知,我们需要将其映射到不同的 numpy.array,在那里我们可以进行该转换。我个人会将我的 numpy.array 转换为一些布尔数组,在那里我可以轻松进行转换,但可能有更好的方法。

2
你可以使用 itertools 中的 cycle 函数来循环遍历你的 nums 列表。然后将其与布尔值进行压缩,再使用三元列表推导式即可。
from itertools import cycle  

>>> [num if boolean else 0 for boolean, num in zip(truths, cycle(nums))]
[1, 0, 0, 0, 2, 3]

1
你可以在这里使用 itertools,因为你说你想要循环。
from itertools import cycle, chain, repeat
import numpy as np

truths = np.array([True, False, False, False, True, True])
nums = np.array([1, 2, 3])

#you have 2 options here.
#Either repeat over nums
iter_nums = cycle(nums)
#or when nums is exhausted
#you just put default value in it's place
iter_nums = chain(nums, repeat(0))

masked = np.array([next(iter_nums) if v else v for v in truths])
print(masked)
#[1, 0, 0, 0, 2, 3]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接