IndexError:形状不匹配:索引数组无法与形状一起广播

时间:2018-02-19 01:53:22

标签: python arrays numpy indexing numpy-broadcasting

a=np.arange(240).reshape(3,4,20)
b=np.arange(12).reshape(3,4)
c=np.zeros((3,4),dtype=int)
x=np.arange(3)
y=np.arange(4)

我想在没有循环的情况下通过以下步骤获得2d(3,4)形状阵列。

for i in x:
    c[i]=a[i,y,b[i]]
c
array([[  0,  21,  42,  63],
       [ 84, 105, 126, 147],
       [168, 189, 210, 231]])

我试过了,

c=a[x,y,b]

但它显示

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

然后我还试图通过newaxis建立[:,None],它也不起作用。

2 个答案:

答案 0 :(得分:3)

尝试:

>>> a[x[:,None], y[None,:], b]
array([[  0,  21,  42,  63],
       [ 84, 105, 126, 147],
       [168, 189, 210, 231]])

讨论

您尝试了a[x,y,b]。请注意错误消息:

>>> a[x, y, b]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: shape mismatch: indexing arrays could not be broadcast
            together with shapes (3,) (4,) (3,4) 

(3,)表示我们需要将x扩展为第一个维度为3,第二个维度为4。我们通过指定x[:,None](实际上允许将x广播到任意大小的第二维)来执行此操作。

同样,错误消息显示我们需要将y映射到(3,4)形状,然后我们使用y[None,:]执行此操作。

替代风格

如果有人愿意,我们可以将None替换为np.newaxis

>>> a[x[:,np.newaxis], y[np.newaxis,:], b]
array([[  0,  21,  42,  63],
       [ 84, 105, 126, 147],
       [168, 189, 210, 231]])

np.newaxis为无:

>>> np.newaxis is None
True

(如果我没记错的话,numpy的某些早期版本为newaxis使用了不同的大小写样式。但是,对于所有版本,None似乎都有效。)

答案 1 :(得分:1)

类似但不同,硬编码不是通用的。

>>> b = np.ravel(a)[np.arange(0,240,21)]
>>> b.reshape((3,4))
array([[  0,  21,  42,  63],
       [ 84, 105, 126, 147],
       [168, 189, 210, 231]])
>>>