假设我有一个长度为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方法来创建一个新的数组,该数组基于数据创建,只有当masks [i]!= 0时,它才会获取data的所有条目?就像这样:
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列表。 - Karl Knechtelnp.ma.array(data, mask=mask).data
(在此之前将列表转换为数组)。 - Memristornp.ma.array(data, mask=mask).data
时,我只得到了原始数组。不太清楚你发的链接如何能用来获得OP想要的结果。 - Mark.data
给出了原始数组。.tolist()
给出了掩码列表,但并不会移除掩码值。它们总是被fill_value
(可以是None
或自定义值)填充。 - tdyx = np.ma.array(...)
的结果,然后使用x[~x.mask].data
,它会移除掩码为0的元素;另一种方法是使用where
:np.where([1, 0, 1, 0, 1], [1, 2, 3, 4, 5], 0)
,它不会移除元素,而是用0替代。 - Memristor