【问题标题】:Resulting Shape for advanced indexing in NumPyNumPy 中高级索引的结果形状
【发布时间】:2021-05-09 19:50:59
【问题描述】:

当索引具有多个相同大小数组的 numpy 数组时,行为取决于索引轴的位置。

  • 如果轴彼此相邻,则将轴添加到索引数组的位置。
  • 如果轴不相邻,则将新轴添加到数组的开头。
import numpy as np
a = np.ones((4, 5, 6, 7, 8))
print(a[:, [0, 1], [0, 1], :, :].shape)       # (4, 2, 7, 8)
print(a[:, [0, 1], :, [0, 1], :].shape)       # (2, 4, 6, 8)
print(a[:, [0, 1], [0, 1], [0, 1], :].shape)  # (4, 2, 8)
print(a[:, [0, 1], [0, 1], :, [0, 1]].shape)  # (2, 4, 7)

我的问题与this question 和答案中提到的PR 有关。 不过好像这个oindex还没有。

我有哪些选择才能实现一致的行为?例如,无论中间是否有:,始终在开头添加新轴。

【问题讨论】:

  • 什么是一致的行为?

标签: python arrays numpy indexing


【解决方案1】:

您的示例清楚地说明了结合高级和基本索引产生的歧义。链接是一个不太明确的情况,涉及列表和标量。

a[:, [0, 1], :, [0, 1], :]

5 和 7 收缩为 2,但它应该使用什么顺序呢?

(4, 2, 6, 8)
(4, 6, 2, 8)

面对这种模棱两可的情况,numpy 开发人员选择将其放在首位

(2, 4, 6, 8)

从 NEP/PR 可以看出,这个问题并不简单,还没有解决。

【讨论】:

  • 是的,我同意。在开头添加新轴是合理的。但我觉得奇怪的是a[:, [0, 1], [0, 1], :, :]不是这样的
  • 但在那种情况下并没有那么模糊,因为 2(或 3)个收缩维度是在一起的。
  • 是的,你是对的。但是,如果您将其视为以两个轴 i 和 j 作为输入的操作,我不希望在 j=i+1 的情况下具有不同的行为。
猜你喜欢
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多