【问题标题】:Numpy array multidimensional indexing with list IndexError: shape mismatch带有列表IndexError的Numpy数组多维索引:形状不匹配
【发布时间】:2017-02-22 04:53:12
【问题描述】:
import numpy as np
a = np.zeros((10,20,30))

要提取第二维和第三维的元素,ind1 和 ind2 是索引列表

ind1 = [0,5,6]
ind2 = [1,2,7,8]
a[:,ind1,ind2]

上面的命令给出了 IndexError: shape mismatch

如果我们按如下方式进行索引

a1 = a[:,ind1,:]
a2 = a1[:,:,ind2]

它有效,如果 ind1 和 ind2 的尺寸相同,则索引有效。

多维数组的索引列表是否必须具有相同的形状?

【问题讨论】:

    标签: python numpy multidimensional-array


    【解决方案1】:

    由于输出的形状由索引数组的形状决定,是的,它们必须相同。

    或者说兼容,如下

    i1, i2 = np.ix_(ind1, ind2)
    a[:, i1, i2]
    

    会起作用。它通过选取 ind1、ind2 的所有组合(i1、i2 的形状为 (3, 1) (1, 4),因此它们一起广播)生成一个 10x3x4 数组。

    相比之下,“正常”行为(当 ind1 和 ind2 不可广播时)只是选择 ind1 和 ind2 的对应元素,这就是它们的形状必须一致的原因。

    这里有一个更简单的例子来展示差异

    >>> z = np.zeros((5,5), int)
    >>> a = [1,2,4]
    >>> z[a,a] = 1
    >>> z # 3 points set
    array([[0, 0, 0, 0, 0],
           [0, 1, 0, 0, 0],
           [0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 0, 0, 1]])
    >>> a1,a2 = np.ix_(a,a)
    >>> z[a1,a2] = 1
    >>> z # 3x3 points set
    array([[0, 0, 0, 0, 0],
           [0, 1, 1, 0, 1],
           [0, 1, 1, 0, 1],
           [0, 0, 0, 0, 0],
           [0, 1, 1, 0, 1]])
    

    【讨论】:

      【解决方案2】:

      Paul 的回答可能会回答您的问题,但我发现它不会起作用,因为如果您执行以下操作,您会同时使用这些索引同时执行这两项操作:

      a[:,ind1,:][:,:,ind2]
      

      它没有得到索引错误

      【讨论】:

      • 不错的把戏。应该给出与np.ix_ 方法相同的输出。当然,np.ix_ 通常会更高效,但您的输入更少。
      • @PaulPanzer 是的,我希望您的解决方案是 numpy 的创建者首选的方法:p
      猜你喜欢
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 2020-10-03
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多