在python中循环通过真值数组并用另一个数组中的组件替换真值

在python中循环通过真值数组并用另一个数组中的组件替换真值,python,arrays,python-3.x,numpy,Python,Arrays,Python 3.x,Numpy,假设我有一个Numpy数组真值数组,它看起来像下面这样: truths = [True, False, False, False, True, True] 我还有另一个值数组,看起来像: nums = [1, 2, 3] 我想创建一个循环,用nums数组中的下一个数字替换truths数组中的所有真值,并用0替换所有假值 我想以这样的方式结束: array = [1, 0, 0, 0, 2, 3] 我推荐numpy.putmask()。由于我们正在从类型bool转换为int64,因此需要先进

假设我有一个Numpy数组真值数组,它看起来像下面这样:

truths = [True, False, False, False, True, True]
我还有另一个值数组,看起来像:

nums = [1, 2, 3]
我想创建一个循环,用nums数组中的下一个数字替换truths数组中的所有真值,并用0替换所有假值

我想以这样的方式结束:

array = [1, 0, 0, 0, 2, 3]

我推荐
numpy.putmask()
。由于我们正在从类型
bool
转换为
int64
,因此需要先进行一些转换

首先,初始化:

truths = np.array([ True, False, False, False,  True,  True])
nums = np.array([1, 2, 3])
然后,我们根据我们的掩码进行转换和替换(如果
truth
的元素为True):

最终结果是:

>>> truths
array([1, 0, 0, 0, 2, 3])
请注意,我们只需将
真相
传递到
numpy.putmask()
的“mask”参数中。这将简单地检查数组
truths
的每个元素是否为truthy;由于我们将数组转换为类型
int64
,它将根据需要仅替换非0的元素

如果我们想变得更迂腐,或者需要替换一些任意值,我们需要
numpy.putmask(truths,truths==,nums)

据我所知,如果我们想变得更迂腐,而不是假设我们可以轻松地转换类型(就像我们可以从
bool
转换到
int64
),我们要么需要进行某种映射到不同的
numpy.array
,在那里我们可以进行转换。我个人这样做的方式是将我的
numpy.array
转换成一些布尔数组,在那里我可以进行简单的转换,但可能有更好的方法。

您可以使用from
itertools
nums
列表中循环。然后用你的布尔语压缩它,用三元列表

from itertools import cycle  

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

您可以在这里使用
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]

如果
truths
中的
Trues
多于
nums
中的数字,会发生什么情况?
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]