我正在使用 SciPy 的
pearsonr(x,y)
方法,但我无法弄清楚为什么会发生以下错误:
ValueError: shape mismatch: objects cannot be broadcast to a single shape
它计算前两个(我正在循环中运行数千个这样的测试),然后就死掉了。有谁知道问题可能是什么?
r_num = n*(np.add.reduce(xm*ym))
这是
pearsonr
方法中发生错误的行。
此特定错误意味着线上算术中使用的变量之一的形状与同一线上的另一个变量不兼容(即,既不同又非标量)。由于
n
和 np.add.reduce()
的输出都是标量,这意味着问题在于 xm
和 ym
,这两个只是您的 x
和 y
输入减去各自的均值。
基于此,我的猜测是您的
x
和 y
输入具有彼此不同的形状,使得它们与元素乘法不兼容。
** 从技术上讲,并不是同一行上的变量具有不兼容的形状。唯一的问题是当两个变量相加、相乘等具有不兼容的形状时,无论变量是否是临时的(例如函数输出)。只要在计算数学表达式之前通过其他方法纠正问题,同一行上两个具有不同形状的变量就可以了。
如果出现此错误,正如错误所述,正在操作的对象的形状无法广播为相同的形状。一个例子是:
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
)中,由于一个是一维数组(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
因此请确保两个数组的长度相同。
Provavelmente em uma das retas,seja You X,tem menos valores (dados) do que a outra reta。 Assim,o sistema não consegue realizar a multiplicação.