过滤 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()
如果您想填写一些其他值而不是 0
s,请传递所需的值。例如,假设我们希望在不满足条件(b > 0
)的地方(即False
)填充一个-9
,那么我们会这样写:
In [43]: np.where(b > 0, *[a, -9])
Out[43]: array([ 1, -9, -9, -9, -9, 4])
也就是说,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()
如果您想填写一些其他值而不是 0
s,请传递所需的值。例如,假设我们希望在不满足条件(b > 0
)的地方(即False
)填充一个-9
,那么我们会这样写:
In [43]: np.where(b > 0, *[a, -9])
Out[43]: array([ 1, -9, -9, -9, -9, 4])