4

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

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]。为什么广播不像我期望的那样工作?

4

1 回答 1

5

此处详细介绍了所谓的“融资索引”规则。特别是,当索引obj是 dtype 的 NumPy 数组时boolx[obj]

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

自从,

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为一维布尔数组:

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]]
于 2013-11-11T21:10:45.970 回答