Skip to main content
 首页 » 编程设计

python之索引错误 : shape mismatch: indexing arrays could not be broadcast together with shapes

2025年05月04日16telwanggs

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:形状不匹配:索引数组无法与形状 (3,) (4,) (3,4) 一起广播

然后我也尝试通过[:,None]建立newaxis,也是不行。

请您参考如下方法:

尝试:

>>> 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,:] 。

另类风格

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

>>> 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似乎有效。)