我有一个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)有更好/不同的方式去做或理解它吗?
答案 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.