2016-07-17 32 views
0

私はデータの線形回帰の傾きを取得したいと思いますが、Yにはいくつかの値が含まれています... 例:Python - Scipyの線形回帰(

from scipy import stats 
import numpy as np 

X = np.array([0,1,2,3,4,5]) 
Y = np.array([np.NaN,4, 5, 10, 2, 5]) 
stats.linregress(X,Y) 

しかし、私が取得:私はあなたが見ることができるように、無効な値をマスクしてみしたがって(ナン、ナン、ナン、ナン、ナン) を:

import numpy.ma as ma 
stats.linregress((X),ma.masked_invalid(Y)) 

しかし、それは同じだ...私は私は何をしなければならないかを見てください...

答えて

1

は、以下のことを試してみてください。

Y=Y[np.logical_not(np.isnan(Y))] 
X=X[np.logical_not(np.isnan(Y))] 

UPD:ウォーレンが気づいたとして、Yが更新されますので、nansがなくなっています。 Y[np.logical_not(np.isnan(Y))]とを線形回帰に直接供給することができます。それとも、あなたがこれを行うことができ、yはnanまたはinfここで(x、y)のペアを削除するにはnp.isfinite

+0

感謝を呼び出すが、私は無限のNUMを持っていると思う:あなただけを行うことができますそれも同じですが、この場合も同じ機能がありますか? – user3601754

+0

http://docs.scipy.org/doc/numpy/reference/generated/numpy.isinf.html – Sleepyhead

+0

解決策に問題があります。最初の行*はY *を変更するので、もはや 'nan'はありません。そして、2行目では、 'np.logical_not(np.isnan(Y))'は常にTrueの値になり、最初は 'Y'に' nan'があった場合、ブール配列の長さは少なくなります'X'の長さよりも大きいので、' X'の終わりから値を単に破棄します。質問に記載されている例でテストしてみましょう。あなたが望むことができないことがわかります。 –

2

とウォーレンの答えを参照してください。

finiteYmask = np.isfinite(Y) 
Yclean = Y[finiteYmask] 
Xclean = X[finiteYmask] 

だけlinregressのためにこれらの「きれい」の配列を使用している場合は、

finiteYmask = np.isfinite(Y) 

、その後、あなたの助けのためのlinregress(X[finiteYmask], Y[finiteYmask])

+1

1つの提案:マスクを 'np.isfinite([X、Y])。all(軸= 0) 'に変更すると、X配列のnan値も処理できます。 – ayhan

+0

@ayhanこれはまた、 'x'が' NaN'か 'inf'でも' y'でもなくインスタンスをマスクするのに役立ちます。右? – Dataman

+1

@Datamanはい、 '.all()'を使って、xとyの両方を有限にします。 – ayhan