numpy:播放布尔的ndarray

com*_*ike 4 python numpy

我有一个情况,我有一个浮点数的ndarray X,让我们说100x10,我想看看第一列的一些条件,并创建一个形状为100x1的布尔ndarray B. 然后我想使用B作为X的索引来拉出True所在的值.然而,对于BI中的每个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])
Run Code Online (Sandbox Code Playgroud)

这打印

[[True]
 [False]]

[[ 1 2 ]
 [ 3 4 ]]

 [1]
Run Code Online (Sandbox Code Playgroud)

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

unu*_*tbu 5

这里详细介绍了所谓的"扇形索引"的规则.特别是,当索引obj是dtype的NumPy数组时bool,x[obj]

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

以来,

In [4]: a.nonzero()
Out[4]: (array([0]), array([0]))
Run Code Online (Sandbox Code Playgroud)

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])
Run Code Online (Sandbox Code Playgroud)

如果你想使用一个布尔数组a来选择b,那么,作为Joran比斯利状态,只是不停地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]]
Run Code Online (Sandbox Code Playgroud)