索引可变维数的 ndarray

Fid*_*idd 2 python indexing numpy multidimensional-array

我有一个 numpy ndarray 实例,但大小可变。

import numpy as np
dimensions = (4, 4, 4)
myarray = np.zeros(shape = dimensions)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到了一个“立方”形状的数组,如果我想索引一个切片,myarray我可以使用它myarray[:][:][0],因为我知道有 3 个维度(我使用 3 对[])。

如果是 4 维,我会使用myarray[:][:][:][0]. 但由于维度的数量可能会改变,所以我不能以这种方式对其进行硬编码。

如何根据维数对此类数组的切片进行索引?看似简单的问题,却想不出任何解决方案。

hpa*_*ulj 5

myarray使用 1 个括号组而不是多个括号组进行索引:

myarray[:,:,:,i]
myarray[:,2,:,:]
myarray[...,3]
myarray[...,3,:]
Run Code Online (Sandbox Code Playgroud)

:您想要的每个维度都有 一个。...代表多个:- 前提numpy是可以清楚地识别数字。

尾随:可以省略,当然使用 时除外...

take可以同样的方式使用;它接受一个axis参数:

np.take(myarray, i, axis=3)
Run Code Online (Sandbox Code Playgroud)

您还可以将索引构建为元组,例如

ind = [slice(None)]*4
ind[2] = 3
myarray[tuple(ind)]
# same as myarray[:,:,3,:]
# myarray.take(3, axis=2)
Run Code Online (Sandbox Code Playgroud)

np.apply_along_axis执行这种类型的索引。

例如

In [274]: myarray=np.ones((2,3,4,5))

In [275]: myarray[:,:,3,:].shape
Out[275]: (2, 3, 5)

In [276]: myarray.take(3,axis=2).shape
Out[276]: (2, 3, 5)

In [277]: ind=[slice(None)]*4; ind[2]=3

In [278]: ind
Out[278]: [slice(None, None, None), slice(None, None, None), 3, slice(None, None, None)]

In [279]: myarray[tuple(ind)].shape
Out[279]: (2, 3, 5)
Run Code Online (Sandbox Code Playgroud)