【问题标题】:Numpy confusion with boolean indexing and broadcasting布尔索引和广播的 Numpy 混淆
【发布时间】:2023-04-03 12:07:01
【问题描述】:

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

我怀疑真正的规则是布尔对象的尺寸必须与原始数组的 initial 尺寸相匹配,并且它选择布尔值为真的每个尺寸的值,返回任何元素的所有元素尾随暗淡。但是我找不到任何官方说明它是如何工作的。

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

【问题讨论】:

  • 对我来说似乎是一个错误...但我们必须询问开发人员这是 numpy 还是 numpy 文档中的错误 :)
  • 我会说如果它是一个错误,那么它就是文档中的一个错误。 y[b] 等价于 y[b, :],因此是有意义的。如果cshape (7,) 是布尔值,那么y[c]y[c,:],因此不起作用,因为它不是广播,而是切片。您必须使用y[:, c]
  • 这是一个文档问题。布尔索引与广播无关。有感觉的请指正文档,在github上可以轻松搞定。
  • @seberg:我很乐意提供帮助。我应该使用docs.scipy.org/numpy/docs/numpy.doc.indexing 的wiki 文档编辑器吗?或者只是查看源代码(我假设文档在某处)并提出拉取请求?
  • @GaryO,我认为原则上 wikidoc 可能有效,但创建拉取请求可能更容易。如果只是小的文本更改,您甚至可以通过 github 的“编辑”按钮来完成。编辑:虽然那样做修正可能很难,所以最好做一个真正的结帐,除非它只是一个错字修正。

标签: python arrays numpy


【解决方案1】:

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.

【讨论】:

  • numpy 引用表明y[b] 实际上与y[b.nonzero()] 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2018-12-23
  • 2015-09-29
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多