python – numpy:广播布尔的ndarray

我有一个情况,我有一个浮点数的ndarray X,让我们说100×10,我想看看第一列的一些条件,并创建一个形状为100×1的布尔ndarray B.然后我想使用B作为X的索引来拉出True所在的值.但是对于B中的每个True,我想要拉出X的整行.我认为这会自动生效,因为B将被广播为100×10的形状.但是它似乎没有这种方式.这是使用2×2和2×1 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].为什么广播不像我期望的那样工作?

最佳答案
所谓的“扇形索引”的规则是detailed here.特别是,当索引obj是dtype bool的NumPy数组时,x [obj]

… is always equivalent to (but faster than) x[obj.nonzero()]
where, as described above, obj.nonzero() returns a tuple (of length
obj.ndim) of integer index arrays showing the True elements of obj.

以来,

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所说的那样,只需保留一个1维布尔数组:

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]]

转载注明原文:python – numpy:广播布尔的ndarray - 代码日志