如何从 NumPy 数组中删除 NaN 值?

2025-02-10 08:57:00
admin
原创
58
摘要:问题描述:如何从 NumPy 数组中删除 NaN 值?[1, 2, NaN, 4, NaN, 8] ⟶ [1, 2, 4, 8] 解决方案 1:要从 NumPy 数组中删除 NaN 值x:x = x[~numpy.isnan(x)] 解释内部函数返回一个布尔/逻辑数组,该数组中所有非数字的numpy....

问题描述:

如何从 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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用