Удалите строку NaN из массива X, а также соответствующую строку в Y

У меня есть массив X с NaN, и я могу удалить строку с NaN как таковой:

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

Но у меня есть соответствующий массив Y

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

Как удалить соответствующие строки из массива Y?

Мой массив X выглядит так:

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

Но что-то странное происходит:

 indexes = ~np.isnan(x) print indexes 

[вне]:

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

Вы избавляетесь от предметов, которые являются NaN, а не рядов с NaN. Правильнее всего было бы:

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

Чтобы увидеть различное поведение обоих подходов:

 >>> 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]] 
 indexes = ~np.isnan(x) x = x[indexes] y = y[indexes]