【发布时间】:2021-06-24 11:05:10
【问题描述】:
假设我有一个长度为 N 的数据 numpy 数组和一个长度为 N 的位掩码数组。
data = [1,2,3,4,5,6,7,8,9,0]
mask = [0,1,0,1,0,1,0,1,0,1]
是否有一种无循环的 numpy 方法来创建基于数据的新数组,这样当且仅当 mask[i] != 0 时它才会获取所有数据条目?像这样:
func(data, mask) = [2,4,6,8,0]
或者等效地用循环表示法:
ans = []
for idx in range(mask):
if mask[idx]:
ans.append(data[idx])
ans = numpy.array(ans)
谢谢!
【问题讨论】:
-
您的问题比链接的副本更简单,因为您只在一个维度上工作。所需的代码是……等待它……
data[mask != 0]。是的,这种简化是 Numpy 的核心卖点之一。当然,您确实需要从 Numpy 数组开始,而不是简单的 Python 列表。 -
您应该检查:numpy doc with solution。在您的情况下,只需执行以下操作:
np.ma.array(data, mask=mask).data(之前将列表更改为数组)。 -
@Memristor 当我尝试
np.ma.array(data, mask=mask).data时,我只得到了原始数组。目前还不清楚您发布的链接如何用于获得 OP 想要的结果。 -
是的,
.data似乎为您提供了原始数组。.tolist()为您提供屏蔽列表,但不删除屏蔽值。它们总是充满fill_value(None或自定义值)。 -
@MarkM 对不起,你必须得到
x = np.ma.array(...)和x[~x.mask].data的结果,它会删除掩码为0 的元素;另一种方法是使用where:np.where([1, 0, 1, 0, 1], [1, 2, 3, 4, 5], 0)不会删除它们,而是用 0 代替。