过滤 numpy 数组但保留原始值

Filter numpy array but keep original value

也就是说,numpy支持'sieving'吗?

我有两个数组:

a = np.array([1, 0, 2, 3, 0, 4])
b = np.array([1, 0, 0, 0, 0, 6])

我想要的是 return 一个新数组,c,它包含基于 b:[=17 的掩码的 a 的原始值=]

c = a[b > 0] 
>> c
np.array([1, 4])
# but what I want is:
# np.array([1, 0, 0, 0, 0, 4])

我可以通过列表理解来解决这个问题:

c = [a[i] if b[i] > 0 else 0 for i in range(len(a))]

我也可以制作面具,但这需要 2 次迭代:

mask = [1 if b[i] > 0 else 0 for i in range(len(b))]  
c = ma.array(a, mask=mask)

numpy 是否有原生的东西允许一个数组对另一个数组充当筛子?

使用np.where:

result = np.where(b > 0, a, 0)
print(result)

或者只是相乘:

import numpy as np

a = np.array([1, 0, 2, 3, 0, 4])
b = np.array([1, 0, 0, 0, 0, 6])

print(a * (b > 0))

输出

[1 0 0 0 0 4]

另一个想法是用零初始化结果数组 c(基于 a 的形状),然后使用布尔掩码填充 a 中的值.下面是一个例子:

# result array
In [28]: c = np.zeros_like(a)  

# get the indices where nonzero values exist in array `b`
In [29]: nonzero_idx = np.nonzero(b)  

# extract the corresponding values from the array `a` and
# fill in the array `c` using the same indices
In [30]: c[nonzero_idx] = a[nonzero_idx] 

In [31]: c 
Out[31]: array([1, 0, 0, 0, 0, 4])

使用numpy.where情况下的解释:

In [42]: np.where(b >  0, *[a, 0])   
Out[42]: array([1, 0, 0, 0, 0, 4])

b > 0 部分是我们要检查的条件,数组 a 中的条目。如果满足此条件,则返回这些元素,否则返回 0;这就是为什么我们将 0 作为第三个参数传递给 numpy.where()

如果您想填写一些其他值而不是 0s,请传递所需的值。例如,假设我们希望在不满足条件(b > 0)的地方(即False)填充一个-9,那么我们会这样写:

In [43]: np.where(b >  0, *[a, -9])     
Out[43]: array([ 1, -9, -9, -9, -9,  4])