如何从 NumPy 数组中删除 NaN 值?
- 2025-02-10 08:57:00
- admin 原创
- 55
问题描述:
如何从 NumPy 数组中删除 NaN 值?
[1, 2, NaN, 4, NaN, 8] ⟶ [1, 2, 4, 8]
解决方案 1:
要从 NumPy 数组中删除 NaN 值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:
对我来说@jmetz 的答案不起作用,但是使用 pandas isnull() 却起作用了。
x = x[~pd.isnull(x)]
解决方案 4:
尝试一下:
import math
print [value for value in x if not math.isnan(value)]
欲了解更多信息,请阅读列表推导。
解决方案 5:
@jmetz 的答案可能是大多数人需要的;但是它产生了一个一维数组,例如,使其无法用于删除矩阵中的整行或整列。
为此,应将逻辑数组缩减为一维,然后索引目标数组。例如,以下将删除至少有一个 NaN 值的行:
x = x[~numpy.isnan(x).any(axis=1)]
请在此处查看更多详细信息。
解决方案 6:
正如其他人所表明的那样
x[~numpy.isnan(x)]
可以。但是如果 numpy dtype 不是本机数据类型(例如,如果它是对象),则会抛出错误。在这种情况下,您可以使用 pandas。
x[~pandas.isna(x)] or x[~pandas.isnull(x)]
解决方案 7:
如果你使用numpy
# first get the indices where the values are finite
ii = np.isfinite(x)
# second get the values
x = x[ii]
解决方案 8:
接受的答案会改变二维数组的形状。我在这里提出一个解决方案,使用 Pandas dropna()功能。它适用于一维和二维数组。在二维情况下,您可以选择删除包含的行或列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+'
Input:
',x,sep='')
print('
dropna:
',dropna(x),sep='')
print('
'+'='*20+' 2D Case: ' +'='*20+'
Input:
',y,sep='')
print('
dropna (rows):
',dropna(y),sep='')
print('
dropna (columns):
',dropna(y,axis=1),sep='')
print('
'+'='*20+' x[np.logical_not(np.isnan(x))] for 2D: ' +'='*20+'
Input:
',y,sep='')
print('
dropna:
',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.]
解决方案 9:
如果有帮助的话,对于简单的一维数组:
x = np.array([np.nan, 1, 2, 3, 4])
x[~np.isnan(x)]
>>> array([1., 2., 3., 4.])
但如果您希望扩展为矩阵并保留形状:
x = np.array([
[np.nan, np.nan],
[np.nan, 0],
[1, 2],
[3, 4]
])
x[~np.isnan(x).any(axis=1)]
>>> array([[1., 2.],
[3., 4.]])
我在处理 pandas 功能时遇到了这个问题,由于它的效率低下.shift()
,我想不惜一切代价避免使用它。.apply(..., axis=1)
解决方案 10:
执行上述操作:
x = x[~numpy.isnan(x)]
或者
x = x[numpy.logical_not(numpy.isnan(x))]
我发现重置为相同变量 (x) 不会删除实际的 nan 值,因此必须使用其他变量。将其设置为其他变量会删除 nan。例如
y = x[~numpy.isnan(x)]
解决方案 11:
只需填写
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]]
解决方案 12:
pandas 引入了一个将所有数据类型转换为缺失值的选项。
该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.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']
解决方案 13:
最简单的方法是:
numpy.nan_to_num(x)
文档:https ://docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html