`ValueError:使用`scipy.stats.linregress`解压缩(预期4)`的值太多了

时间:2016-08-02 15:43:42

标签: python scipy linear-regression

我知道当更多变量设置为值而不是函数返回时,会出现此错误消息(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,:]))

3 个答案:

答案 0 :(得分:5)

您的问题源于切片XY数组。此外,您不需要for循环。请改用以下内容,它应该可以正常工作。

slope, intercept, r_value, p_value, std_err = stats.linregress(X[:,0], Y[:,0])

答案 1 :(得分:1)

问题源于您对np.asarray的输入是单个元素列表的列表。

因此,XY的形状均为(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]

这三种方法都会导致XY形状(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[:])