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

问题描述:

如何从 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用