通过布尔掩码数组选择numpy数组的元素

时间:2013-11-14 17:16:55

标签: python numpy indexing boolean mask

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

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 个答案:

答案 0 :(得分:39)

你可能想要这样的东西:

>>> 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,或者它将解释False和{ {1}} True0并为您提供以下列:

1

答案 1 :(得分:0)

您可以使用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)

答案 2 :(得分: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遮盖或隐藏的列。在这种情况下,我们希望屏蔽掉最后两列。

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