numpy:播放布尔的ndarray

时间:2013-11-11 20:51:28

标签: python numpy

我有一种情况,我有一个浮点数的ndarray X,比方说100x10,我想查看第一列的一些条件并创建一个形状为100x1的布尔ndarray B.然后我想使用B作为X的索引来拉出True所在的值。但是对于B中的每个True,我想要拉出X的整行。我认为这会自动生效,因为B将被广播为100x10的形状。但是它似乎没有这种方式。这是一个使用2x2和2x1 ndarrays的例子。

a = np.array([True, False])
a.shape = (2,1)
b = np.array([1, 2, 3, 4])
b.shape = (2,2)
print(a)
print(b)
print(b[a])

打印

[[True]
 [False]]

[[ 1 2 ]
 [ 3 4 ]]

 [1]

我希望它能打印[1 2]。为什么广播不像我期望的那样工作?

1 个答案:

答案 0 :(得分:5)

所谓的“扇动索引”的规则是detailed here。特别是,当索引obj是dtype bool的NumPy数组时,x[obj]

  

...总是等于(但快于)x [obj.nonzero()]   其中,如上所述,obj.nonzero()返回一个元组(长度为   obj.ndim)显示obj的True元素的整数索引数组。

由于,

In [4]: a.nonzero()
Out[4]: (array([0]), array([0]))

b[a]相当于b[a.nonzero()]

In [6]: b[(np.array([0]), np.array([0]))]
Out[6]: array([1])
In [7]: b[a]
Out[7]: array([1])

如果您想使用布尔数组a来选择b,那么,正如Joran Beasley所述,只需将a保留为1 -dimensional boolean array:

import numpy as np

a = np.array([True, False])
b = np.array([1, 2, 3, 4])
b.shape = (2,2)
print(b[a])    
# [[1 2]]