我正在使用SciPy的pearsonr(x,y)方法,我不知道为什么会发生以下错误:
pearsonr(x,y)
ValueError: shape mismatch: objects cannot be broadcast to a single shape
它计算前两个(我在一个循环中运行了几千个这样的测试),然后就死了。
r_num = n*(np.add.reduce(xm*ym))
这是pearsonr方法中发生错误的行。
pearsonr
ijxebb2r1#
这个特殊的错误意味着在这条线上的算术运算中使用的变量之一具有与同一条线上的另一个变量不兼容的形状由于n和np.add.reduce()的输出都是标量,这意味着问题在于xm和ym,其中两个简单地是你的x和y输入减去它们各自的平均值。基于此,我的猜测是,x和y输入具有彼此不同的形状,使得它们不兼容元素乘法。
n
np.add.reduce()
xm
ym
x
y
**从技术上讲,并不是同一行上的变量具有不兼容的形状。唯一的问题是当两个变量被相加,相乘等时具有不兼容的形状,无论变量是否是临时的(例如,函数输出)。同一行上具有不同形状的两个变量是好的,只要在计算数学表达式之前有其他东西纠正了这个问题。
sxpgvts32#
如果你得到这个错误,正如错误所说,被操作的对象的形状不能被广播为相同的形状。一个例子是:
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绘制条形图时。例如,
a
b
shape=(3,)
shape=(2,1)
shape=(2,3)
scipy.stats
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
因此,确保两个数组具有相同的长度。
2条答案
按热度按时间ijxebb2r1#
这个特殊的错误意味着在这条线上的算术运算中使用的变量之一具有与同一条线上的另一个变量不兼容的形状由于
n
和np.add.reduce()
的输出都是标量,这意味着问题在于xm
和ym
,其中两个简单地是你的x
和y
输入减去它们各自的平均值。基于此,我的猜测是,
x
和y
输入具有彼此不同的形状,使得它们不兼容元素乘法。**从技术上讲,并不是同一行上的变量具有不兼容的形状。唯一的问题是当两个变量被相加,相乘等时具有不兼容的形状,无论变量是否是临时的(例如,函数输出)。同一行上具有不同形状的两个变量是好的,只要在计算数学表达式之前有其他东西纠正了这个问题。
sxpgvts32#
如果你得到这个错误,正如错误所说,被操作的对象的形状不能被广播为相同的形状。一个例子是:
在第一种情况(
a
)中,numpy不能强制两个数组具有相同的形状。然而,在第二种情况(b
)中,由于一个是1D数组(shape=(3,)
),另一个是2D数组(shape=(2,1)
),因此两者都可以广播到shape=(2,3)
数组中。scipy.stats
中的函数不再产生此错误;例如,pearsonr
执行数据验证以检查样本长度是否匹配,这显示了更有用的消息。显示此错误的一个流行函数是使用matplotlib绘制条形图时。例如,
一个常见的错误是使用一些布尔条件过滤一个数组,但不将相同的布尔数组应用于另一个数组。例如:
因此,确保两个数组具有相同的长度。