HOWTO · NumPy
如何从 NumPy 数组中删除 NaN 值
了解如何在 Python 中从 NumPy 数组中删除 NaN 值
本页内容
要从 NumPy 数组中删除 NaN 元素,可以先创建一个掩码,让非 NaN 值对应 True,再用该掩码选取元素。对于 NumPy 数组,array[~np.isnan(array)] 是简洁的写法。
在 NumPy 中使用 logical_not() 和 isnan() 函数删除 NaN 值
np.isnan(array) 会返回一个布尔数组,其中 NaN 元素对应 True。np.logical_not() 会反转这些布尔值,因此结果掩码会让普通数值对应 True。布尔索引会按元素原有顺序保留掩码为 True 的元素。对于 NumPy 布尔数组,~ 运算符是较短的等价写法。
下面的示例同时使用这两种写法,并展示输入全为 NaN 或完全不含 NaN 时的结果:
import numpy as np
values = np.array([1.0, np.nan, 3.0])
without_nan = values[np.logical_not(np.isnan(values))]
without_nan_short = values[~np.isnan(values)]
all_nan = np.array([np.nan, np.nan])
no_nan = np.array([1, 2, 3])
print(without_nan)
print(without_nan_short)
print(all_nan[~np.isnan(all_nan)])
print(no_nan[~np.isnan(no_nan)])
[1. 3.]
[1. 3.]
[]
[1 2 3]
这两个掩码会得到相同的筛选结果。输入全为 NaN 时,结果数组不包含任何元素;输入不含 NaN 时,数组会保持原样。请参阅 np.logical_not() 的官方文档 和 np.isnan() 的官方文档。
在 NumPy 中使用 isfinite() 函数删除 NaN 值
np.isfinite(array) 会创建一个掩码,其中有限数值对应 True。用它进行索引可以删除 NaN,但也会删除正无穷和负无穷。如果你只想保留有限值,可以使用这个函数;如果只想删除 NaN 并保留无穷值,请使用上面的反转 np.isnan() 掩码。有关它对数值类型的行为,请参阅 np.isfinite() 官方文档。
使用 math.isnan() 函数删除 NaN 值
Python 标准库中的 math.isnan() 一次检查一个标量值。先通过 import math 导入该模块。对于一维数值数组,可以用列表推导式创建布尔掩码:keep = [not math.isnan(value) for value in values],然后执行 filtered = values[keep]。这种方法会在 Python 中逐个遍历数组元素,而 NumPy 函数则直接作用于数组。这里的写法适用于一维输入;遍历多维数组时,得到的是子数组而非标量数值。
使用 pandas.isnull() 函数删除 NaN 值
如果项目中已经使用 pandas,可以通过 import pandas as pd 导入它;pd.isnull() 用于识别缺失值,并可通过反转其结果提供掩码:filtered = values[~pd.isnull(values)]。这是 pandas 函数,不是 NumPy 方法;如果任务只需 NumPy,就不必为了这一步额外安装 pandas。对于 pandas 支持的数据结构,该函数还可以识别其他缺失值标记。请参阅现有的 pandas isnull() 参考文档。