Numpy与布尔索引和广播的混淆

时间:2013-11-20 16:56:19

标签: python arrays numpy

我有一个numpy数组y:

y = np.arange(35).reshape(5,7)

5行,7列。现在我创建一个布尔1-d 5元素掩码,它选择我想要的行(遵循numpy indexing处的文档):

b = np.array([False, False, True, False, True])

然后y[b]返回感兴趣的行。但是文档令人困惑:它说

  

布尔数组必须与被索引的数组具有相同的形状,或者可以播放到相同的形状。

&b 不能用y:

播放
>>> np.broadcast_arrays(y, b)
ValueError: shape mismatch: two or more arrays have incompatible dimensions on axis 1.

因为广播的工作方式是匹配尾随尺寸并向后工作。

在这种布尔索引的情况下,显然有一些不同的规则在起作用;文件是错的还是我只是误解了?如果我按照文档建议的那样做,并使b成形(5,1),它就不会挑出行;它只获取每个选定行的第一列,并将其作为一维数组返回。

我怀疑真正的规则是布尔对象的dims必须与原始数组的初始 dims匹配,并且它选择布尔为true的每个dims的值,返回任何元素尾随dims。但我找不到任何官方说它是如何运作的。

所以我的问题是,(a)我做得对吗,文件是错的? (b)我读错了文件吗? (c)有更好/不同的方式去做或理解它吗?

1 个答案:

答案 0 :(得分:0)

y[b]的缩减似乎符合您的要求。我不认为它与文档不一致,并且没有特殊情况下布尔与数字进行广播。

y[b] # gives what you want
# broadcast booleans
np.broadcast_arrays(b, y) #gives the error you saw
np.broadcast_arrays(b[:,np.newaxis], y) #broadcasts.
# same as broadcast numbers
np.broadcast_arrays(np.arange(5), y) #ALSO gives the error you saw
np.broadcast_arrays(np.arange(5)[:,np.newaxis], y) #broadcasts.