2014-12-17 11 views
6

I NaN ile bir X dizi bilgisi ve örneğin, NaN satır kaldırmak:X diziden NaN satır çıkarın ve aynı zamanda karşılık gelen satır Y

import numpy as np 
x = x[~np.isnan(x)] 

Ama karşılık gelen bir Y dizi var

assert len(x) == len(y) # True 
x = x[~np.isnan(x)] 
assert len(x) == len(y) # False and breaks 

Y dizisinden karşılık gelen satırları nasıl silerim?

My X dizisi şöyle görünür:

>>> x 
[[ 2.67510434 2.67521927 3.49296989 3.80100625 4.   2.83631844] 
[ 3.47538057 3.4752436 3.62245715 4.0720535 5.   3.7773169 ] 
[ 2.6157049 2.61583852 3.48335887 3.78088813 0.   2.78791096] 
..., 
[ 3.60408952 3.60391203 3.64328267 4.1156462 5.   3.77933333] 
[ 2.66773792 2.66785516 3.49177798 3.7985113 4.   2.83631844] 
[ 3.26622238 3.26615124 3.58861468 4.00121327 5.   3.49693169]] 

Ama tuhaf bir şey oluyor:

indexes = ~np.isnan(x) 
print indexes 

[dışarı]: Sen alıyorsanız

[[ True True True True True True] 
[ True True True True True True] 
[ True True True True True True] 
..., 
[ True True True True True True] 
[ True True True True True True] 
[ True True True True True True]] 
+2

Şunu musunuz 'y y = [~ np.isnan (x)]' Yukarıdaki? X = x [~ np.isnan (x)] '_after_ bu ifadeyi çağırmayı unutmayın. – xnx

+0

@xnx, evet bu doğru, aptalca ... – alvas

+0

np.mat (x) [~ np.isnan (x)] 'ı deneyin. np.array (x) [~ np.isnan (x)] 'np.mat boyutlarını korurken 1d dizisini döndürecek. –

cevap

3

Na değil, r NaN ile ows. yapılacak doğru şey olacaktır:

mask = ~np.any(np.isnan(x), axis=1) 
x = x[mask] 
y = y[mask] 

her iki yaklaşımın farklı davranışlar görmek için:

>>> x = np.random.rand(4, 5) 
>>> x[[0, 2], [1, 4]] = np.nan 
>>> x 
array([[ 0.37499461,   nan, 0.51254549, 0.5253203 , 0.3955948 ], 
     [ 0.73817831, 0.70381481, 0.45222295, 0.68540433, 0.76113544], 
     [ 0.1651173 , 0.41594257, 0.66327842, 0.86836192,   nan], 
     [ 0.70538764, 0.31702821, 0.04876226, 0.53867849, 0.58784935]]) 
>>> x[~np.isnan(x)] # 1D array with NaNs removed 
array([ 0.37499461, 0.51254549, 0.5253203 , 0.3955948 , 0.73817831, 
     0.70381481, 0.45222295, 0.68540433, 0.76113544, 0.1651173 , 
     0.41594257, 0.66327842, 0.86836192, 0.70538764, 0.31702821, 
     0.04876226, 0.53867849, 0.58784935]) 
>>> x[~np.any(np.isnan(x), axis=1)] # 2D array with rows with NaN removed 
array([[ 0.73817831, 0.70381481, 0.45222295, 0.68540433, 0.76113544], 
     [ 0.70538764, 0.31702821, 0.04876226, 0.53867849, 0.58784935]] 
+0

benim için " np.any (np.isnan (x, axis = 1)) 'bir hata döndürür:' TypeError: 'axis' geçersiz bir anahtar kelimedir ufunc 'isnan'' için – alvas

+0

ben parantezin yeriyle karıştırdım 'np.any (np.isnan (x), eksen = 1)'. – Jaime

+0

teşekkürler! Bu işe yaradı! – alvas

2
indexes = ~np.isnan(x) 
x = x[indexes] 
y = y[indexes] 
+0

İndeksError: 'dizisi için çok fazla indeks' cevabınız ve ayrıca @xnx yöntemi. – alvas

+0

'x' ve' y' aynı uzunlukta olduğundan emin misiniz? –

+0

Ben alıyorum len (np.isnan (x)) == len (x) == len (y) 'doğru ... – alvas