【问题标题】:Indexing ndarray of variable number of dimensions索引可变维数的ndarray
【发布时间】:2016-06-08 10:04:03
【问题描述】:

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

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

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

如果是 4 个维度,我会使用 myarray[:][:][:][0]。但是由于维度的数量可能会改变,我不能这样硬编码。

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

【问题讨论】:

  • 当你写myarray[:][:][0]时,你的意思是myarray[:, :, 0]吗?前者刚好等于myarray[0],后者不等于。
  • (假设你的意思是后者,问题是stackoverflow.com/questions/12116830/…的重复)

标签: python numpy multidimensional-array indexing


【解决方案1】:

您使用 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 执行这种类型的索引。

例如

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)

【讨论】:

    【解决方案2】:

    你可以使用:

    import numpy as np
    dimensions = (4, 4, 4)
    myarray = np.zeros(shape = dimensions)
    
    print myarray[..., 0]
    

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

    【讨论】:

    • 如果我想调用第 i 个而不是最后一个索引怎么办?
    • 如果您不知道array 中的shape,您就无法知道您想要获得哪个项目。您无法获得一般索引。
    • np.take;它需要一个轴参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2019-09-13
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多