使用布尔掩码数组选择NumPy数组的元素

55

我有一个长度为n的布尔掩码数组a

a = np.array([True, True, True, False, False])

我有一个包含n列的二维数组:

b = np.array([[1,2,3,4,5], [1,2,3,4,5]])

我想要一个新的数组,其中只包含“True”值,例如

c = ([[1,2,3], [1,2,3]])

c = a * b无法使用,因为它也包含了假列中的“0”,而我不想要这个

c = np.delete(b, a, 1) does not work

有什么建议吗?

3个回答

73

您可能想要像这样的东西:

>>> a = np.array([True, True, True, False, False])
>>> b = np.array([[1,2,3,4,5], [1,2,3,4,5]])
>>> b[:,a]
array([[1, 2, 3],
       [1, 2, 3]])

请注意,为了使此种类型的索引工作,需要使用像您所使用的 ndarray 而不是 list,否则它将把 FalseTrue 解释为 01 并向您提供这些列:

>>> b[:,[True, True, True, False, False]]   
array([[2, 2, 2, 1, 1],
       [2, 2, 2, 1, 1]])

3
我用过这个解决方案,效果很好!但是,当扩展到形状为(2800000,600)的ndarray时,尝试使用带有200个True值的掩码会变得很慢。有什么优化方法吗? - jfive
2.8M?通常我会建议使用即时编译 - http://numba.pydata.org/ - 但不确定它是否对此有帮助。 - nycynik
1
尝试使用numpy.compress(用于布尔值)或numpy.take(用于索引),请参见https://dev59.com/4ek5XIcBkEYKwwoY9-lg - Tom
1
我已经计算了掩码,并且必须将掩码转换为类型np.bool。所以我添加了b[:,a.astype(np.bool)] - Markus Weber

4
你可以使用 numpy.ma 模块,并使用 np.ma.masked_array 函数来实现。
>>> x = np.array([1, 2, 3, -1, 5])                                                
>>> mx = ma.masked_array(x, mask=[0, 0, 0, 1, 0])
masked_array(data=[1, 2, 3, --, 5], mask=[False, False,  False, True, False], fill_value=999999)

0

希望我没有来晚!这是你的数组:

X = np.array([[1, 2, 3, 4, 5], 
              [1, 2, 3, 4, 5]])

让我们创建一个与X形状相同的零数组:

mask = np.zeros_like(X)
# array([[0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0]])

接下来,指定您想要用1屏蔽或隐藏的列。在这种情况下,我们希望屏蔽最后2列。

mask[:, -2:] = 1
# array([[0, 0, 0, 1, 1],
#        [0, 0, 0, 1, 1]])

创建一个掩码数组:
X_masked = np.ma.masked_array(X, mask)
# masked_array(data=[[1, 2, 3, --, --],
#                    [1, 2, 3, --, --]],
#              mask=[[False, False, False,  True,  True],
#                    [False, False, False,  True,  True]],
#              fill_value=999999)

我们可以对 X_masked 进行任何操作,比如对每一列求和(在 axis=0 的方向上):
np.sum(X_masked, axis=0)
# masked_array(data=[2, 4, 6, --, --],
#              mask=[False, False],
#              fill_value=1e+20)

这个很棒的地方在于X_masked只是X的一个视图,而不是副本。

X_masked.base is X
# True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接