数值错误:形状不匹配:无法广播对象到单一形状。

48
我正在使用SciPy的pearsonr(x,y)方法,但我无法弄清为什么会出现以下错误:
ValueError: shape mismatch: objects cannot be broadcast to a single shape

它计算了前两个(我正在循环中运行数千个这些测试),然后就停止了。有人对问题可能是什么有任何想法吗?

r_num = n*(np.add.reduce(xm*ym))

这是出现错误的pearsonr方法中的那一行。

2个回答

56

这个特定的错误表示在同一行上执行算术运算时,其中一个变量与另一个变量的形状不兼容(即,两者既不相同又不是标量)。由于nnp.add.reduce()的输出都是标量,因此可以推断问题出在xmym身上,它们只是您的xy输入减去它们各自的均值。

基于此,我猜测您的xy输入彼此之间具有不同的形状,使它们无法进行逐元素乘法。

** 从技术上讲,并不是在同一行上的变量具有不兼容的形状。唯一的问题是当正在添加、相乘等操作的两个变量具有不兼容的形状时,无论这些变量是临时的(例如函数输出)还是不是。如果在数学表达式被求值之前进行了修正,则具有不同形状的两个变量在同一行上是可以接受的。


0
如果您遇到此错误,那么就像错误所说的那样,被操作对象的形状无法广播为相同的形状。一个例子是:
x = np.array([1, 2, 3])
y = np.array([4, 5])

a = np.broadcast_arrays(x, y)             # ValueError: shape mismatch
b = np.broadcast_arrays(x, y[:, None])    # OK; calling `np.add.reduce()` on it also OK

在第一种情况下(a),numpy 无法强制两个数组具有相同的形状。然而,在第二种情况下(b),由于一个是1D数组(shape=(3,)),另一个是2D数组(shape=(2,1)),因此两者都可以广播成一个形状为shape=(2,3)的数组。

scipy.stats中没有任何一个函数会再次产生这个错误了;例如,pearsonr函数将执行数据验证以检查样本长度是否匹配,这将显示更有用的消息。

在matplotlib中绘制条形图时,会出现一个非常流行的函数,会显示这个错误。例如:

x = ['a', 'b']
y = [1, 2, 3]
plt.bar(x, y);       # ValueError: shape mismatch
plt.barh(x, y);      # ValueError: shape mismatch

一个常见的错误是使用某些布尔条件过滤一个数组,但没有将相同的布尔数组应用于另一个数组。例如:
x = np.array(['a', 'b', 'c'])
y = np.array([1, 2, 3])
plt.bar(x, y);             # OK
plt.bar(x, y[y>1]);        # ValueError: shape mismatch
plt.bar(x[y>1], y[y>1]);   # OK

所以请确保两个数组具有相同的长度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接