问题:从数组中删除Nan值
我想弄清楚如何从数组中删除nan值。我的数组看起来像这样:
x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration
如何从中删除nan
值x
?
回答 0
如果您对数组使用numpy,也可以使用
x = x[numpy.logical_not(numpy.isnan(x))]
等效地
x = x[~numpy.isnan(x)]
[感谢chbrown新增了速记]
说明
内部函数numpy.isnan
返回一个布尔值/逻辑数组,该数组在True
每个地方都x
具有非数字值。因为我们希望相反,我们使用逻辑不操作,~
以获得与阵列True
到处都是这x
是一个有效的数字。
最后,我们使用此逻辑数组索引到原始数组x
,仅检索非NaN值。
回答 1
filter(lambda v: v==v, x)
由于v!= v仅适用于NaN,因此适用于列表和numpy数组
回答 2
回答 3
对我来说,@ jmetz的答案不起作用,但是使用熊猫的isull()可以。
x = x[~pd.isnull(x)]
回答 4
执行以上操作:
x = x[~numpy.isnan(x)]
要么
x = x[numpy.logical_not(numpy.isnan(x))]
我发现重置为相同的变量(x)不会删除实际的nan值,而必须使用其他变量。将其设置为其他变量将删除nans。例如
y = x[~numpy.isnan(x)]
回答 5
如其他人所示
x[~numpy.isnan(x)]
作品。但是,如果numpy dtype不是本机数据类型(例如,如果它是object),则将引发错误。在这种情况下,您可以使用熊猫。
x[~pandas.isna(x)] or x[~pandas.isnull(x)]
回答 6
所述接受的答案改变为2D阵列的形状。我在这里提出了一个使用Pandas dropna()功能的解决方案。它适用于一维和二维阵列。在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.]
回答 7
如果您正在使用 numpy
# first get the indices where the values are finite
ii = np.isfinite(x)
# second get the values
x = x[ii]
回答 8
最简单的方法是:
numpy.nan_to_num(x)
文档:https : //docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html
回答 9
这是我为NaN和infs过滤ndarray “ X”的方法,
我创建的行映射不包含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
nor inf
。
回答 10
@jmetz的答案可能是大多数人需要的答案。但是,它会产生一维数组,例如,使其无法删除矩阵中的整个行或列。
为此,应将逻辑数组缩小为一维,然后索引目标数组。例如,以下内容将删除至少具有一个NaN值的行:
x = x[~numpy.isnan(x).any(axis=1)]