有没有一种标准的方法获取一个0D的Numpy子数组?

3
给定一个numpy的ndarray和一个索引:
a = np.random.randint(0,4,(2,3,4))
idx = (1,1,1)

有没有一种简洁的方法来检索 a 中在 idx 处的 0D 子数组?

类似于以下内容:

a[idx + (None,)].squeeze()

但更加专业?

请注意@filippo的巧妙之处。

a[idx][...]

is not equivalent. 首先,它不能用于对象数组。但更严重的是它不会返回子数组,而是一个新数组:

b = a[idx][...]
b[()] = 7
a[idx] == 7
# False
2个回答

2
我不确定我是否正确理解了您的要求,这个看起来足够简洁了吗?
In [1]: import numpy as np

In [2]: a = np.random.randint(0,4,(2,3,4))
   ...: idx = (1,1,1)
   ...: 

In [3]: a[idx]
Out[3]: 2

In [4]: a[idx][...]
Out[4]: array(2)

编辑:请注意,这将返回一个副本,而不是同一数组的0D视图


哇,我不知道那个!谢谢!但是,唉,它不能用于对象数组。我已经更新了问题。 - Paul Panzer
a[idx+(Ellipsis,)] 似乎可以工作。它将两个想法融合在一起。对于对象数组,a[idx] 返回一个 int。对于 int 数组,它返回 np.int32。这已经是一个接近 0d 数组的近亲了。看看它的方法和属性。 - hpaulj
@hpaulj 是的!就是这样。我认为这值得回答。- 是近亲,但我想要的是可变性和与原始数组共享数据。 - Paul Panzer
嗯,你说得对,如果我没记错的话,高级索引总是会复制。但我想不出比@hpaulj更好的答案了,请添加一个回答! - filippo

2
b = a[idx+(Ellipsis,)]

我正在一台机器上进行测试,并在平板电脑上编写此文,因此无法提供我的通常的验证代码。
也许最好的文档说明(或事实陈述)是:

https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html#detailed-notes

当省略号(...)存在但没有大小(即替换为零:))时,结果仍将始终是一个数组。如果没有高级索引,则为视图;否则为副本。

有趣的是,这实际上是我在 SO 上的第一篇帖子的另一个反例,猜猜谁回答了那个问题... - Paul Panzer
好的,让我向你提出挑战,解释一下为什么这个实际上是有效的! - Paul Panzer
a[1,1,1,...] 中,Ellipsis 表示填充剩余的维度,就像 [:]* 一样。这可以是2、1或者在这种情况下是0。我发现一条文档注释,说明了即使它没有完全解释操作的行为。 - hpaulj
谢谢!那是一个完整的答案。 - Paul Panzer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接