通过python中的真实数组循环,并用另一个数组中的组件代替真实值



,假设我有一个numpy阵列真实数组,看起来如下:

truths = [True, False, False, False, True, True]

我还有另一个看起来像:

的值
nums = [1, 2, 3]

我想创建一个循环,该循环将用NUMS数组中的下一个数字替换真实数组中的所有真实值,然后用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 = 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()的"掩码"参数中。这只需检查一下数组truths的每个元素是否是真实的;由于我们将数组转换为类型int64,因此它将仅根据需要替换不是0的元素。

如果我们想更加学费或更换一些任意价值,则需要numpy.putmask(truths, truths==<value we want to replace>, nums)

如果我们想更加学费,而不是假设我们可以轻松地转换类型(从boolint64(,据我所知,我们要么需要进行某种形式映射到其他numpy.array,我们可以进行转换。我个人做的方式是将我的numpy.array转换为一些布尔数组,我可以在其中进行这种简单的转换,但可能会有更好的方法。

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

您可以在此处使用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]

最新更新