0

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

我第一次天真的尝试

Asub = A[:,cols]

给出了相当奇怪的结果,没有必要在这里引用......

按照 pv. 对这个问题的回答,我尝试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)结果数组。我想我可以将结果分解为二维,但肯定有更好的方法来做到这一点?

4

2 回答 2

4

正如文档所讨论的那样,“当 obj 是布尔类型的数组对象(例如可能从比较运算符返回)时,就会发生您想要的布尔索引。”

IOW,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 解释为整数,并为您提供 columns [1, 1, 0]

奥托:

In [18]: A[:,numpy.array(ind)]
Out[18]: 
array([[1, 0],
       [0, 2],
       [0, 0]])
于 2012-11-09T13:11:08.677 回答
1

转换ind为数组:

>>> A[:, np.array(ind)]
array([[1, 0],
       [0, 2],
       [0, 0]])
于 2012-11-09T13:13:10.800 回答