Я хочу выяснить, как удалить значения Nan из моего массива. Мой массив выглядит примерно так:
x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration
Как я могу удалить значения nan
из x
?
Я хочу выяснить, как удалить значения Nan из моего массива. Мой массив выглядит примерно так:
x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration
Как я могу удалить значения nan
из x
?
Если вы используете numpy для своих массивов, вы также можете использовать
x = x[numpy.logical_not(numpy.isnan(x))]
Эквивалентно
x = x[~numpy.isnan(x)]
[Спасибо за добавленную сокращенную статью]
Объяснение
Внутренняя функция numpy.isnan
возвращает логический/логический массив, который имеет значение True
всюду, что x
не является числом. Поскольку мы хотим обратное, мы используем логический-не оператор, ~
, чтобы получить массив с True
всюду, что x
допустимое число.
Наконец, мы используем этот логический массив для индексации в исходный массив x
, чтобы получить только значения, отличные от NaN.
filter(lambda v: v==v, x)
работает как для списков, так и для массива numpy так как v!= v только для NaN
Попробуйте следующее:
import math
print [value for value in x if not math.isnan(value)]
Подробнее читайте в List Consrehensions.
Для меня ответ @jmetz не работал, однако использование pandas isnull() сделал.
x = x[~pd.isnull(x)]
Выполнение вышеуказанного:
x = x[~numpy.isnan(x)]
или
x = x[numpy.logical_not(numpy.isnan(x))]
Я обнаружил, что сброс на ту же переменную (x) не удалял фактические значения nan и должен был использовать другую переменную. Устанавливая его на другую переменную, удалены nans. например
y = x[~numpy.isnan(x)]
Как показывают другие
x[~numpy.isnan(x)]
работает. Но он будет вызывать ошибку, если numpy dtype не является родным типом данных, например, если это объект. В этом случае вы можете использовать pandas.
x[~pandas.isnan(x)]
Если вы используете numpy
# first get the indices where the values are finite
ii = np.isfinite(x)
# second get the values
x = x[ii]
ик неук джули аллемаал де мёдер
Это мой подход к фильтру 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
.
Принятый ответ меняет форму для 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.]
Самый простой способ:
numpy.nan_to_num(x)
Документация: https://docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html