同时索引多维numpy数组的多个维度时出现问题

okxuctiv  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(147)

考虑一个4维numpy数组(变量a),我们有一个.shape =(16,5,66,717),从包含4个元素的第二维中,我想选择第二个和第五个元素:

b = a[:, [1,4],:,:]

B.shape返回(16,2,66,717),所以我想我所做的是正确的。现在我想从第一个维度中提取4个元素(第八、第十一、第十二、第十三),从第二个维度中提取两个元素(第二和第五):

b = a[[7,10,12,13,14], [1,4],:,:]

这会产生错误:

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (5,) (2,)

我不明白为什么numpy数组中大于1维的同时索引不起作用。我想我可以依次执行B = a[:,[1,4],:,:]和c = b[[7,10,12,13,1,4],:,:,:]来得到我想要的结果,但是一定有一种方法可以一步完成。你能帮忙吗?

y1aodyip

y1aodyip1#

制作较小的3D数组:

In [155]: a = np.arange(24).reshape(2,3,4)
In [158]: a
Out[158]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

选择两个“行”(在中间尺寸上):

In [159]: a[:,[0,2],:]
Out[159]: 
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [20, 21, 22, 23]]])

如果我们使用相同形状的2个列表(或数组),我们最终会从[159]中选择2个“行”:

In [160]: a[[0,1],[0,2],:]
Out[160]: 
array([[ 0,  1,  2,  3],
       [20, 21, 22, 23]])

如果第一个列表/数组是“列向量”,我们选择(2,2)“块”:

In [161]: a[[[0],[1]],[0,2],:]
Out[161]: 
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [20, 21, 22, 23]]])

ix_可用于创建相同的2个数组:

In [162]: np.ix_([0,1],[0,2])
Out[162]: 
(array([[0],
        [1]]),
 array([[0, 2]]))

因此,使用ix_数组:

In [163]: I,J = np.ix_([0,1],[0,2])
In [164]: a[I,J,:]
Out[164]: 
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [20, 21, 22, 23]]])

当我说它们相互广播时,我的意思与在加法或乘法期间广播的意思相同:

In [165]: I*10 + J
Out[165]: 
array([[ 0,  2],
       [10, 12]])

参考:https://numpy.org/doc/stable/user/basics.indexing.html#advanced-indexing

编辑

In [166]: np.ix_([7,10,12,13,14], [1,4])
Out[166]: 
(array([[ 7],
        [10],
        [12],
        [13],
        [14]]),
 array([[1, 4]]))

关于您的错误:

In [167]: np.ix_([7,10,12,13,14], [1,4],:,:)
  Input In [167]
    np.ix_([7,10,12,13,14], [1,4],:,:)
                                  ^
SyntaxError: invalid syntax

ix_是一个函数。在函数调用中不允许使用“:”。它只在索引中有效,在索引中它被转换为slice。这就是为什么会出现语法错误。

相关问题