Numpy报”ValueError:shape mismatch:objects cannot be broadcast to a single shape “的原因以及解决办法

  • Post category:Python

问题分析:

“ValueError: shape mismatch: objects cannot be broadcast to a single shape” 是 Numpy(NumPy Numeric Python)经常出现的一个错误,原因是在数组运算的时候,参与运算的数组的形状不一致,无法进行广播(broadcasting)运算。

在广播运算中,如果两个数组的形状不匹配,Numpy会比较它们的维度(从最后一维开始往前比较),如果有一维是相同的,或者某一维存在一个是一维的,那么这两个数组就是可以广播运算的。如果两个数组的维度都不匹配,并且不能广播,则会报出 “ValueError: shape mismatch: objects cannot be broadcast to a single shape” 的错误。

解决办法:

出现该错误,需要检查数组的形状,确保数组形状匹配或可以广播,如果不匹配,需要通过reshape、transpose、expand_dims等函数变换数组形状使其可以进行广播操作。下面是解决 “ValueError: shape mismatch: objects cannot be broadcast to a single shape” 的具体步骤:

  1. 检查数组的形状是否匹配或可以广播;
  2. 若数组的形状不匹配或无法广播,则格外注意参与运算的两个数组是否存在广播规则,即是否可以在输入的数组形状上添加一个长度为1的维度,以便使它们的形状能够匹配,从而进行广播运算;
  3. 如果数组形状无法广播,则需要进行形状变换,以保证数组形状的匹配性,其中常用方法包括reshape、transpose、expand_dims。

示例:

对于如下代码:

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([1, 2, 3, 4])

c = a + b
print(c)

此时,会报出以下错误:

ValueError: operands could not be broadcast together with shapes (2,2) (4,)

原因是数组a和数组b的形状不匹配,无法进行广播操作。为了修复这个问题,可以使用reshape函数将数组b的形状进行变换,如下所示:

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([1, 2, 3, 4]).reshape(2, 2)

c = a + b
print(c)

输出结果为:

[[2 4]
[6 8]]

这样就不会报错了,因为此时的数组a和数组b的形状匹配,可以进行广播运算。