使用布尔列表对numpy矩阵中的列(或行)建立索引

时间:2012-11-09 13:03:47

标签: numpy indexing

给定形状A的numpy矩阵(m,n)和长度为ind的布尔值列表n,我想提取A的列其中布尔列表的对应元素为真。

我的第一次天真尝试

Asub = A[:,cols]

给出了非常奇怪的结果,没有必要引用这里......

按照pv。对this question的回答,我尝试使用numpy.ix_,如下所示:

>>> A = numpy.diag([1,2,3])
>>> ind = [True, True, False]
>>> A[:,numpy.ix_(ind)]
array([[[1, 0]],

       [[0, 2]],

       [[0, 0]]])
>>> A[:,numpy.ix_(ind)].shape
(3, 1, 2)

现在结果形状不合适:我希望得到一个(3,2)结果数组。我想我可以将结果分解为两个维度,但肯定有更好的方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:4)

作为docs discuss,你想要的布尔索引“当obj是布尔类型的数组对象时出现(例如可能从比较运算符返回)。”

以下,ind必须是ndarray类型的bool

In [15]: A = numpy.diag([1,2,3])

In [16]: ind = [True, True, False]

In [17]: A[:,ind]
Out[17]: 
array([[0, 0, 1],
       [2, 2, 0],
       [0, 0, 0]])
发生

因为它将bool解释为整数,并为您提供了列[1, 1, 0]

OTOH:

In [18]: A[:,numpy.array(ind)]
Out[18]: 
array([[1, 0],
       [0, 2],
       [0, 0]])

答案 1 :(得分:1)

ind转换为数组:

>>> A[:, np.array(ind)]
array([[1, 0],
       [0, 2],
       [0, 0]])