Как удалить все строки в numpy.ndarray, содержащие нечисловые значения

95

В основном я занимаюсь анализом данных. Я читаю набор данных как numpy.ndarray, и некоторые значения отсутствуют (либо из-за отсутствия там NaN, либо из-за того, что строка написана " NA").

Я хочу очистить все строки, содержащие любую подобную запись. Как мне это сделать с numpy ndarray?

зебра
источник

Ответы:

164
>>> a = np.array([[1,2,3], [4,5,np.nan], [7,8,9]])
array([[  1.,   2.,   3.],
       [  4.,   5.,  nan],
       [  7.,   8.,   9.]])

>>> a[~np.isnan(a).any(axis=1)]
array([[ 1.,  2.,  3.],
       [ 7.,  8.,  9.]])

и переназначьте это на a.

Объяснение: np.isnan(a)возвращает аналогичный массив с Trueгде NaN, в Falseдругом месте. .any(axis=1)сокращает m*nмассив до nс помощью логической orоперации над целыми строками, ~инвертирует True/Falseи a[ ]выбирает только те строки из исходного массива, которые Trueзаключены в квадратные скобки.

Eumiro
источник
11
np.isfiniteтакже полезен в этом случае, а также когда вы хотите избавиться от ±Infзначений. Он не требует ~, поскольку он возвращает истину только для конечных вещественных чисел.
naught101 07
7
@ naught101 Вам также нужно изменить anyна all. Так как вы хотите выбрать строки, в которых «все конечны», вместо того, чтобы выбирать строки, в которых «не все являются nan».
AnnanFay