如何从NumPy数组中删除NaN值?
[1, 2, NaN, 4, NaN, 8] ⟶ [1, 2, 4, 8]
如何从NumPy数组中删除NaN值?
[1, 2, NaN, 4, NaN, 8] ⟶ [1, 2, 4, 8]
当前回答
最简单的方法是:
numpy.nan_to_num(x)
文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html
其他回答
试试这个:
import math
print [value for value in x if not math.isnan(value)]
要了解更多,请阅读列表推导式。
Pandas引入了一个将所有数据类型转换为缺失值的选项。
https://pandas.pydata.org/docs/user_guide/missing_data.html
np.isnan()函数不兼容所有的数据类型,例如:
>>> import numpy as np
>>> values = [np.nan, "x", "y"]
>>> np.isnan(values)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
pd.isna()和pd.notna()函数与许多数据类型兼容,pandas引入了pd.notna()函数。NA值:
>>> import numpy as np
>>> import pandas as pd
>>> values = pd.Series([np.nan, "x", "y"])
>>> values
0 NaN
1 x
2 y
dtype: object
>>> values.loc[pd.isna(values)]
0 NaN
dtype: object
>>> values.loc[pd.isna(values)] = pd.NA
>>> values.loc[pd.isna(values)]
0 <NA>
dtype: object
>>> values
0 <NA>
1 x
2 y
dtype: object
#
# using map with lambda, or a list comprehension
#
>>> values = [np.nan, "x", "y"]
>>> list(map(lambda x: pd.NA if pd.isna(x) else x, values))
[<NA>, 'x', 'y']
>>> [pd.NA if pd.isna(x) else x for x in values]
[<NA>, 'x', 'y']
使用实例删除NumPy数组x中的NaN值。
x = x[~numpy.isnan(x)]
解释
内部函数numpy。isnan返回一个布尔/逻辑数组,当x不是数字时,该数组的值为True。因为我们想要相反的结果,所以我们使用非逻辑操作符~来获得一个数组,在x为有效数字的任何地方都是true。
最后,我们使用这个逻辑数组对原始数组x进行索引,以便只检索非nan值。
如果你使用numpy
# first get the indices where the values are finite
ii = np.isfinite(x)
# second get the values
x = x[ii]
简单地填充
x = numpy.array([
[0.99929941, 0.84724713, -0.1500044],
[-0.79709026, numpy.NaN, -0.4406645],
[-0.3599013, -0.63565744, -0.70251352]])
x[numpy.isnan(x)] = .555
print(x)
# [[ 0.99929941 0.84724713 -0.1500044 ]
# [-0.79709026 0.555 -0.4406645 ]
# [-0.3599013 -0.63565744 -0.70251352]]