当len < ndim时,使用元组(或列表)索引numpy数组如何实现?

3

I have a 3d numpy array, eg:

>>> A = np.arange(24).reshape(2,3,4)

我想基于轴1和轴2的一对坐标,沿轴0获取1d切片:

>>> h = 1
>>> l = 2
>>> A[:,h,l]
array([ 6, 18])

目前为止一切顺利。但是,如果我的坐标对以元组或列表的形式存储,而不是两个整数,该怎么办呢?我尝试了一些显而易见的选项,但都没有成功:

>>> coords = (1,2)
>>> A[coords]
array([20, 21, 22, 23])
>>> A[:,coords]
array([[[ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>> A[...,coords]
array([[[ 1,  2],
        [ 5,  6],
        [ 9, 10]],

       [[13, 14],
        [17, 18],
        [21, 22]]])

我在谷歌上搜索了这个问题,但没有找到相关的内容。可能是因为我使用的关键词不当。如果这是一个过于简单的问题,那么请见谅!


您需要将坐标解压缩成两个单独的数组,分别对应于最后两个轴。例如,h,l = coords(注意,此时coords可能是二维的)。或者我是否误解了问题? - Joe Kington
1个回答

5
你可以直接构造切片元组,例如:
In [11]: A[(slice(None),) + coords]
Out[11]: array([ 6, 18])

这是因为调用 A[:, 1, 2] 等价于 / 调用:
In [12]: A.__getitem__((slice(None, None, None), 1, 2))
Out[12]: array([ 6, 18])

1
只是顺便提一下给楼主:它必须严格是切片的元组,而不仅仅是任何可迭代对象。Numpy会以完全不同的方式解释传入的数组或列表。非常好的解释! - Joe Kington
1
使用元组的注意事项是正确的。然而,ind=[slice(None)]*3; ind[1:]=coords; A[ind]同样有效。在http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html中有一条关于保持与旧数值包的向后兼容性的说明(针对包含切片的列表)。 - hpaulj

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