,假设我有一个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)
。
如果我们想更加学费,而不是假设我们可以轻松地转换类型(从bool
到int64
(,据我所知,我们要么需要进行某种形式映射到其他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]