我知道当更多变量设置为值而不是函数返回时,会出现此错误消息(ValueError: too many values to unpack (expected 4)
)。
scipy.stats.linregress
根据scipy文档(http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html)返回5个值。
这是一个简短,可重现的工作电话示例,然后是一个失败的电话,linregress
:
什么可以解释差异,为什么第二个差点被称为?
from scipy import stats
import numpy as np
if __name__ == '__main__':
x = np.random.random(10)
y = np.random.random(10)
print(x,y)
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
'''
Code above works
Code below fails
'''
X = np.asarray([[-15.93675813],
[-29.15297922],
[ 36.18954863],
[ 37.49218733],
[-48.05882945],
[ -8.94145794],
[ 15.30779289],
[-34.70626581],
[ 1.38915437],
[-44.38375985],
[ 7.01350208],
[ 22.76274892]])
Y = np.asarray( [[ 2.13431051],
[ 1.17325668],
[ 34.35910918],
[ 36.83795516],
[ 2.80896507],
[ 2.12107248],
[ 14.71026831],
[ 2.61418439],
[ 3.74017167],
[ 3.73169131],
[ 7.62765885],
[ 22.7524283 ]])
print(X,Y) # The array initialization succeeds, if both arrays are print out
for i in range(1,len(X)):
slope, intercept, r_value, p_value, std_err = (stats.linregress(X[0:i,:], y = Y[0:i,:]))
答案 0 :(得分:5)
您的问题源于切片X
和Y
数组。此外,您不需要for
循环。请改用以下内容,它应该可以正常工作。
slope, intercept, r_value, p_value, std_err = stats.linregress(X[:,0], Y[:,0])
答案 1 :(得分:1)
问题源于您对np.asarray
的输入是单个元素列表的列表。
因此,X
和Y
的形状均为(12,1):
print(X.shape) # (12, 1) [or (12L, 1L), depending on version]
print(Y.shape) # (12, 1)
请注意,这些是二维数组。即使其中一个维度为1,它们仍然被认为是二维的。
现在考虑这种创建数组的方式:
x = np.asarray([1,2,3,4,5])
print(x.shape) # (5,)
请注意,在这种情况下,由于我们将整数列表传递给asarray
,因此我们得到了一维数组。
当使用两个变量调用时,您的函数需要每个都是一维数组。因此,您可以最初将数组创建为一维:
例如,手工:
X = np.asarray([-15.93675813,
-29.15297922,
36.18954863,
37.49218733,
-48.05882945,
-8.94145794,
15.30779289,
-34.70626581,
1.38915437,
-44.38375985,
7.01350208,
22.76274892])
或者通过列表理解:
y_data = [[ 2.13431051],
[ 1.17325668],
[ 34.35910918],
[ 36.83795516],
[ 2.80896507],
[ 2.12107248],
[ 14.71026831],
[ 2.61418439],
[ 3.74017167],
[ 3.73169131],
[ 7.62765885],
[ 22.7524283 ]]
Y = np.asarray([e[0] for e in y_data])
或切片:
Y = np.asarray([[ 2.13431051],
[ 1.17325668],
[ 34.35910918],
[ 36.83795516],
[ 2.80896507],
[ 2.12107248],
[ 14.71026831],
[ 2.61418439],
[ 3.74017167],
[ 3.73169131],
[ 7.62765885],
[ 22.7524283 ]])
Y = Y[:,0]
这三种方法都会导致X
和Y
形状(12,)
(一维):
print(X.shape) # (12,)
print(Y.shape) # (12,)
然后,您可以将循环用作:
for i in range(3,len(X)):
slope, intercept, r_value, p_value, std_err = stats.linregress(X[0:i], y = Y[0:i])
print(slope)
注意,我在3开始循环,它是#34;有意义的第一个值"。
或,您可以将您的数组保持为二维修改,只需修复循环中的切片语法:
for i in range(3,len(X)):
slope, intercept, r_value, p_value, std_err = stats.linregress(X[0:i,0], y = Y[0:i,0])
print(slope)
这是我评论的答案中建议的方法。
答案 2 :(得分:0)
经过几次尝试,以下对我有用:
slope, intercept, r_value, p_value, std_err = stats.linregress(X[:], Y[:])