索引可变维数的ndarray

时间:2016-02-25 14:48:34

标签: python numpy multidimensional-array indexing

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

import numpy as np
dimensions = (4, 4, 4)
myarray = np.zeros(shape = dimensions)

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

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

如何根据维数来索引这样一个数组?看起来像一个简单的问题,虽然无法想到任何解决方案。

2 个答案:

答案 0 :(得分:3)

您使用1个括号设置索引myarray,而不是多个括号:

myarray[:,:,:,i]
myarray[:,2,:,:]
myarray[...,3]
myarray[...,3,:]

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

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

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

np.take(myarray, i, axis=3)

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

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

np.apply_along_axis执行这种索引方式。

e.g。

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)

答案 1 :(得分:0)

您可以使用:

import numpy as np
dimensions = (4, 4, 4)
myarray = np.zeros(shape = dimensions)

print myarray[..., 0]

它将获得最后一个索引的第一项。