Удаление значений nan из массива - программирование
Подтвердить что ты не робот

Удаление значений nan из массива

Я хочу выяснить, как удалить значения Nan из моего массива. Мой массив выглядит примерно так:

x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration

Как я могу удалить значения nan из x?

4b9b3361

Ответ 1

Если вы используете numpy для своих массивов, вы также можете использовать

x = x[numpy.logical_not(numpy.isnan(x))]

Эквивалентно

x = x[~numpy.isnan(x)]

[Спасибо за добавленную сокращенную статью]

Объяснение

Внутренняя функция numpy.isnan возвращает логический/логический массив, который имеет значение True всюду, что x не является числом. Поскольку мы хотим обратное, мы используем логический-не оператор, ~, чтобы получить массив с True всюду, что x допустимое число.

Наконец, мы используем этот логический массив для индексации в исходный массив x, чтобы получить только значения, отличные от NaN.

Ответ 2

filter(lambda v: v==v, x)

работает как для списков, так и для массива numpy так как v!= v только для NaN

Ответ 3

Попробуйте следующее:

import math
print [value for value in x if not math.isnan(value)]

Подробнее читайте в List Consrehensions.

Ответ 4

Для меня ответ @jmetz не работал, однако использование pandas isnull() сделал.

x = x[~pd.isnull(x)]

Ответ 5

Выполнение вышеуказанного:

x = x[~numpy.isnan(x)]

или

x = x[numpy.logical_not(numpy.isnan(x))]

Я обнаружил, что сброс на ту же переменную (x) не удалял фактические значения nan и должен был использовать другую переменную. Устанавливая его на другую переменную, удалены nans. например

y = x[~numpy.isnan(x)]

Ответ 6

Как показывают другие

x[~numpy.isnan(x)]

работает. Но он будет вызывать ошибку, если numpy dtype не является родным типом данных, например, если это объект. В этом случае вы можете использовать pandas.

x[~pandas.isnan(x)]

Ответ 7

Если вы используете numpy

# first get the indices where the values are finite
ii = np.isfinite(x)

# second get the values
x = x[ii]

Ответ 8

ик неук джули аллемаал де мёдер

Ответ 9

Это мой подход к фильтру ndarray "X" для NaNs и Infs,

Я создаю карту строк без каких-либо NaN и любой inf следующим образом:

idx = np.where((np.isnan(X)==False) & (np.isinf(X)==False))

idx - это кортеж Во втором столбце (idx[1]) содержатся индексы массива, где ни NaN, ни inf не найдены в строке.

Затем:

filtered_X = X[idx[1]]

filtered_X содержит X без NaN и inf.

Ответ 10

Принятый ответ меняет форму для 2d массивов. Я представляю решение здесь, используя функциональность Pandas dropna(). Работает для 1D и 2D массивов. В 2D-случае вы можете выбрать погоду, чтобы удалить строку или столбец, содержащий np.nan.

import pandas as pd
import numpy as np

def dropna(arr, *args, **kwarg):
    assert isinstance(arr, np.ndarray)
    dropped=pd.DataFrame(arr).dropna(*args, **kwarg).values
    if arr.ndim==1:
        dropped=dropped.flatten()
    return dropped

x = np.array([1400, 1500, 1600, np.nan, np.nan, np.nan ,1700])
y = np.array([[1400, 1500, 1600], [np.nan, 0, np.nan] ,[1700,1800,np.nan]] )


print('='*20+' 1D Case: ' +'='*20+'\nInput:\n',x,sep='')
print('\ndropna:\n',dropna(x),sep='')

print('\n\n'+'='*20+' 2D Case: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna (rows):\n',dropna(y),sep='')
print('\ndropna (columns):\n',dropna(y,axis=1),sep='')

print('\n\n'+'='*20+' x[np.logical_not(np.isnan(x))] for 2D: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna:\n',x[np.logical_not(np.isnan(x))],sep='')

Результат:

==================== 1D Case: ====================
Input:
[1400. 1500. 1600.   nan   nan   nan 1700.]

dropna:
[1400. 1500. 1600. 1700.]


==================== 2D Case: ====================
Input:
[[1400. 1500. 1600.]
 [  nan    0.   nan]
 [1700. 1800.   nan]]

dropna (rows):
[[1400. 1500. 1600.]]

dropna (columns):
[[1500.]
 [   0.]
 [1800.]]


==================== x[np.logical_not(np.isnan(x))] for 2D: ====================
Input:
[[1400. 1500. 1600.]
 [  nan    0.   nan]
 [1700. 1800.   nan]]

dropna:
[1400. 1500. 1600. 1700.]