ValueError:形状不匹配:对象不能广播到单个形状



我正在使用SciPy的pearsonr(x,y)方法,我无法弄清楚为什么会发生以下错误:

ValueError: shape mismatch: objects cannot be broadcast to a single shape

它计算前两个(我在一个循环中运行了几千个这样的测试),然后终止。有人知道是什么问题吗?

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

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

这个特殊的错误意味着在一行上的算术中使用的一个变量的形状与同一行上的另一个变量的形状不兼容(即,不同且非标量)。由于nnp.add.reduce()的输出都是标量,这意味着问题在于xmym,这两个只是你的xy的输入减去它们各自的平均值。

基于此,我的猜测是您的xy输入具有彼此不同的形状,使它们不兼容元素智能乘法。

**从技术上讲,并不是同一行上的变量具有不兼容的形状。唯一的问题是,当两个变量被添加、相乘等具有不兼容的形状时,无论变量是否是临时的(例如,函数输出)。在同一行上有两个形状不同的变量是可以的,只要在计算数学表达式之前有别的东西可以纠正这个问题。

如果你得到这个错误,正如错误所说,被操作的对象的形状不能被广播为相同的形状。例如:

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

所以要确保两个数组的长度相同

最新更新