我有一种情况,我有一个浮点数的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]
。为什么广播不像我期望的那样工作?
答案 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]]