首页 文章

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

提问于
浏览
3

我有一个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),它就不会挑出行;它只获取每个选定行的第一列,并将其作为一维数组返回 .

我怀疑真正的规则是布尔对象's dims must match the original array' s初始变暗,并且它选择布尔为真的每个dims的值,返回任何尾随dim的所有元素 . 但我可以't find anything official that says that'它是如何工作的 .

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

1 回答

  • 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.
    

相关问题