在python中循环通过真值数组并用另一个数组中的组件替换真值
假设我有一个Numpy数组真值数组,它看起来像下面这样:在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,因此需要先进
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
转换成一些布尔数组,在那里我可以进行简单的转换,但可能有更好的方法。您可以使用fromitertools
在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]