Answers:
如果您对数组使用numpy,也可以使用
x = x[numpy.logical_not(numpy.isnan(x))]
等效地
x = x[~numpy.isnan(x)]
[感谢chbrown新增了速记]
说明
内部函数numpy.isnan
返回一个布尔值/逻辑数组,该数组在True
每个地方都x
具有非数字值。因为我们希望相反,我们使用逻辑不操作,~
以获得与阵列True
到处都是这x
是一个有效的数字。
最后,我们使用此逻辑数组索引到原始数组x
,仅检索非NaN值。
x = x[numpy.isfinite(x)]
x = x[~numpy.isnan(x)]
,等同于mutzmatron的原始答案,但更短。如果您想保留自己的无限性numpy.isfinite(numpy.inf) == False
,请当然知道这一点,但是~numpy.isnan(numpy.inf) == True
。
np.where(np.isfinite(x), x, 0)
x
不是numpy数组。如果要使用逻辑索引,它必须是一个数组-例如x = np.array(x)
filter(lambda v: v==v, x)
由于v!= v仅适用于NaN,因此适用于列表和numpy数组
x
与类型的解决方案相对应,只需指定一次即可x[~numpy.isnan(x)]
。当x
由长表达式定义时,这很方便,并且您不想通过创建临时变量来存储此长表达式的结果而使代码混乱。
print ([value for value in x if not math.isnan(value)])
np
软件包中使用此列表理解答案:因此,返回您的列表而不使用[value for value in x if not np.isnan(value)]
对我来说,@ jmetz的答案不起作用,但是使用熊猫的isull()可以。
x = x[~pd.isnull(x)]
如其他人所示
x[~numpy.isnan(x)]
作品。但是,如果numpy dtype不是本机数据类型(例如,如果它是object),则将引发错误。在这种情况下,您可以使用熊猫。
x[~pandas.isna(x)] or x[~pandas.isnull(x)]
所述接受的答案改变为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.]
最简单的方法是:
numpy.nan_to_num(x)
文档:https : //docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html
NaN
s 替代了大量,而OP要求完全删除元素。