布尔索引和广播的Numpy混淆

2024-04-24 06:23:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个纽比阵列y:

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

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

^{pr2}$

然后y[b]返回感兴趣的行。但是医生很困惑:它说

Boolean arrays must be of the same shape as the array being indexed, or broadcastable to the same shape.

b是可与y一起广播的:

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

因为广播是通过匹配尾部维度和反向工作来实现的。在

在这个布尔索引的例子中,显然有一些不同的规则在起作用;doc是错的还是我只是误解了它?如果我按照doc的建议将b设为shape(5,1),它不会选择行;它只获取每个选定行的第一列并将其作为一维数组返回。在

我怀疑真正的规则是布尔对象的dim必须与原始数组的initialdim相匹配,并且它选择布尔值为真的每个dim的值,返回任何尾随dim的所有元素。但我找不到任何官方的说法。在

所以我的问题是:(a)我做得对,医生就是错了吗?(b) 我看错医生了吗?(c) 有没有更好的/不同的方法来做或理解它?在


Tags: orthe元素doc规则np数组医生
1条回答
网友
1楼 · 发布于 2024-04-24 06:23:42

还原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.

相关问题 更多 >