使用元组进行Numpy数组切片

3
我已经阅读了有关numpy切片的文档(特别是底部讨论可变数组索引的部分)https://docs.scipy.org/doc/numpy/user/basics.indexing.html,但我仍然不确定如何实现以下内容:编写一个方法,该方法返回一个3D索引集或4D索引集,然后用于访问数组。我想为一个基类编写一个方法,但从它派生的类根据实例化的派生类访问3D或4D。示例代码以说明这个想法:import numpy as np
a = np.ones([2,2,2,2])
size = np.shape(a)
print(size)
for i in range(size[0]):
  for j in range(size[1]):
    for k in range(size[2]):
      for p in range(size[3]):
        a[i,j,k,p] = i*size[1]*size[2]*size[3] + j*size[2]*size[3] + k*size[3] + p

print(a)

print('compare')
indices = (0,:,0,0)
print(a[0,:,0,0])
print(a[indices])

简而言之,我正在尝试获得一个元组(或其他内容),该元组可以根据我如何填充元组来进行以下两个访问:
a[i, 0, :, 1]
a[i, :, 1]
切片方法看起来很有前途,但似乎需要一个范围,而我只想要一个":"即整个维度。有哪些选项可用于变量numpy数组维度访问?

4
请使用 slice(None) 代替 : - hpaulj
2
或者 idx = np.s_[i, 0, :, 7]a[idx] 等。 - Paul Panzer
@hpaulj 那个方法有效。你能提交一个完整的答案吗? - wandadars
2个回答

2
In [324]: a = np.arange(8).reshape(2,2,2)
In [325]: a
Out[325]: 
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])

slicing:

In [326]: a[0,:,0]
Out[326]: array([0, 2])
In [327]: idx = (0,slice(None),0)   # interpreter converts : into slice object
In [328]: a[idx]
Out[328]: array([0, 2])

In [331]: idx
Out[331]: (0, slice(None, None, None), 0)
In [332]: np.s_[0,:,0]              # indexing trick to generate same
Out[332]: (0, slice(None, None, None), 0)

0

您的代码似乎使用:按照您的意愿工作。这两个示例之所以

(a[i, 0, :, 7], a[i, :, 7])

不工作是因为7超出了数组的范围。如果您将7更改为范围内的某个值,例如1,则它会返回一个值,我认为这就是您要寻找的内容。

我的错误。这段代码只是一个最小的示例。我已经对原始帖子进行了编辑。 - wandadars

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