给定形状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)
结果数组。我想我可以将结果分解为两个维度,但肯定有更好的方法可以做到这一点吗?
答案 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]])