2016-08-02 83 views
0

我知道这个错误信息(ValueError: too many values to unpack (expected 4))出现多个变量设置为值比函数返回时。`ValueError:太多的值来解压缩(预期4)`与`scipy.stats.linregress``

scipy.stats.linregress根据scipy文档返回5个值(http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html)。

这里是一个工作电话的短,重复的例子,然后呼叫失败,到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

你能发布完整的错误信息和堆栈跟踪吗? – njzk2

+2

你的X和Y的形状是:(12,1),但你需要的是(12,)。 – Dataman

+0

也是''i'的值导致这个问题? – njzk2

回答

2

您的问题,从切片XY阵列起源。您也不需要for循环。使用下面的代替,它应该工作。

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

他们可能*想* for'循环仍然(很难说)。但解决方案*是*将'[...,:]'更改为'[...,0]'。 – jedwards

+0

我假设他/他已经使用'for'循环来处理数组的形状。如果使用正确的切片,则不需要“for”循环。 – Dataman

+0

我以为他们试图得到* n *不同回归的结果,每个回归都考虑X/Y中的一个额外元素。 – jedwards

0

问题的事实,您输入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] 

这三种方法都会导致你有X和形状(12,) 210(一维):

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,它的第一个值是“有道理”。

或者,你可以让你的阵列未修改的二维,只是解决您的循环中的切片语法:

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) 

这是在我评论的回答提出的方法。

相关问题