2016-08-02 13 views
0

`と私はより多くの変数が関数リターンよりも値が設定されている場合、このエラーメッセージ(ValueError: too many values to unpack (expected 4))が表示されていることを知っています。`とValueError:解凍するためにあまりにも多くの値(4予想)` scipy.stats.linregress`

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

完全なエラーメッセージとスタックトレースを投稿できますか? – 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

私は、X/Yで1つの追加要素を考慮した* n *回帰の結果を得ようとしていると思いました。 – jedwards

0

問題がnp.asarrayへのご入力は、単一の要素のリストのリストであるという事実に由来します。これらはそれぞれ二次元配列であること

print(X.shape) # (12, 1) [or (12L, 1L), depending on version] 
print(Y.shape) # (12, 1) 

したがって、XY両方が(12,1)の形状を有しています。寸法の1が1であるにもかかわらず、彼らはまだ2次元と考えられています。我々はasarrayに整数のリストを渡されたことから、我々は一次元配列を得、この場合は

x = np.asarray([1,2,3,4,5]) 
print(x.shape) # (5,) 

注:

は今のアレイを作成するためのこの方法を検討してください。二つの変数と呼ば

あなたの機能

は、それぞれが1次元配列にする必要があります。スライス

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]) 

かによって:たとえば

、手で:

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 ]]) 
Y = Y[:,0] 

すべての3つの方法は、あなたが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でループを開始し、それは「理にかなっていることを最初の値です"

または、あなたは2次元としてそのままご使用のアレイを維持し、ちょうどあなたのループ内スライス表記を修正できます。

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) 

これは、私がコメントされた答えで提案された方法であり、 。

関連する問題