使用布尔向量在Numpy的2D数组中选择行

11

我有一个矩阵和一个布尔向量:

>>>from numpy import *
>>>a = arange(20).reshape(4,5)
array([[ 0,  1,  2,  3,  4],
   [ 5,  6,  7,  8,  9],
   [10, 11, 12, 13, 14],
   [15, 16, 17, 18, 19]])

>>>b = asarray( [1, 1, 0, 1] ).reshape(-1,1)
array([[1],
   [1],
   [0],
   [1]])
现在,我希望选择矩阵中所有与向量中相应索引相等的零对应行。
>>>a[b==0]
array([10])

我该如何使其返回特定的行?

[10, 11, 12, 13, 14]
2个回答

5
< p > b 的形状有点奇怪,但如果你能将它制作成更好的索引,那么它就是一个简单的选择:

idx = b.reshape(a.shape[0])
print a[idx==0,:]

>>> [[10 11 12 13 14]]

你可以这样理解,"选择所有索引为0的行,并且对于每一行所选取的列都要选择。" 你期望的答案应该是一个列表嵌套的列表,因为你正在请求符合条件的所有行。

0
九年后,我想在这个问题中再添加一个答案,假设b实际上是一个布尔向量。
使用标量索引对Numpy矩阵进行方括号索引会给出相应的行,例如a[2]会给出a的第三行。可以使用索引向量选择多行(可能有重复)。
同样,与行数相同长度的逻辑向量充当“掩码”,例如:
a = np.arange(20).reshape(4,5)
b = np.array( [True, True, False, True] )

a[b] # 3x5 matrix formed with the first, second, and last row of a

具体回答问题,从那里开始做的唯一事情就是否定向量b

a[ np.logical_not(b) ]

最后,如果 b 在原始帖子中被定义为由1和0构成的“列状”数组,那么只需要执行以下操作:np.logical_not( b.ravel().astype(bool) )

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