2013-11-20 48 views
3

我有一个numpy的阵列Y:numpy的混乱与布尔索引和广播

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

5行,第7列。现在,我创造出挑选出我想要的行(在numpy indexing的文档以下)的布尔1-d 5元素面膜:

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

然后y[b]返回感兴趣的行。但是文档很混乱:它说

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

,B是 broadcastable与Y:

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

因为广播的工作原理是匹配后的尺寸和向后工作。

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

我怀疑真正规则是布尔对象的变暗必须与原始阵列的初始变暗匹配,并且它选择每个那些变暗其中布尔值为true的值,返回任何尾随变暗的所有元素。但我找不到任何官方说这就是它的工作原理。

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

+0

看起来像我的错误......但我们不得不问开发者,这是否是在numpy的或numpy的文档:) – mgilson

+1

我说,如果这是一个错误这是一个错误的错误在文档中。 'y [b]'等同于'y [b,:]',并且这样做是有道理的。如果'c'是'shape'(7,)'的布尔值,那么'y [c]'是'y [c,:]',所以不起作用,因为它不是广播,而是切片。你必须使用'y [:,c]'。 – askewchan

+1

这是一个文档问题。布尔索引与广播无关。如果你觉得它,请修改文档,你可以在github上轻松完成。 – seberg

回答

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. 
+0

numpy引用说'y [b]'和'y [b.nonzero()]'实际上是一样的。 – hpaulj