1

换句话说,numpy 是否支持“筛分”?

我有两个数组:

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

我想要的是返回一个新数组,c它包含a基于掩码的原始值b

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 是否有一些原生的东西可以让一个数组像另一个数组的筛子一样工作?

4

2 回答 2

2

使用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]
于 2019-09-26T17:31:31.917 回答
1

另一个想法是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,则传递所需的值。例如,假设我们希望在不满足-9条件()的地方(即)填写 a,那么我们将编写如下内容:b > 0False

In [43]: np.where(b >  0, *[a, -9])     
Out[43]: array([ 1, -9, -9, -9, -9,  4])
于 2019-09-26T18:22:56.920 回答