NumPy 怎么识别缺失值?

文章导读
Previous Quiz Next 数组中识别缺失值 在数组中识别缺失值意味着找到数据缺失的位置,在 NumPy 中通常表示为 NaN(Not a Number)。您可以使用 NumPy 的 np.isnan() 函数来识别数组中的缺失值。
📋 目录
  1. A 数组中识别缺失值
  2. B 使用 isnan() 函数
  3. C 多维数组中识别缺失值
  4. D 结构化数组中识别缺失值
  5. E 数组中缺失值的计数
  6. F 使用 np.isnan() 函数进行布尔索引
A A

NumPy - 识别缺失值



Previous
Quiz
Next

数组中识别缺失值

在数组中识别缺失值意味着找到数据缺失的位置,在 NumPy 中通常表示为 NaN(Not a Number)。您可以使用 NumPy 的 np.isnan() 函数来识别数组中的缺失值。

NaN 是由 IEEE 浮点标准定义的一种特殊的浮点值,用于表示未定义或无法表示的值,例如 0/0 的结果或涉及 NaN 的数学运算。

使用 isnan() 函数

NumPy 中的 np.isnan() 函数用于识别数组中的 NaN(Not a Number)值。

该函数检查数组中的每个元素,并返回相同形状的布尔数组,其中每个元素如果原始数组中对应元素为 NaN 则为 True,否则为 False。以下是其语法 −

numpy.isnan(x)

其中,x 是要检查 NaN 值的输入数组。

示例

在以下示例中,我们使用 np.isnan() 函数创建一个掩码,用于识别数组中的 NaN 值 −

import numpy as np

# 创建包含 NaN 值的数组
arr = np.array([1.0, 2.5, np.nan, 4.7, np.nan, 6.2])

# 使用 np.isnan() 识别 NaN 值
nan_mask = np.isnan(arr)

print("Original Array:\n", arr)
print("NaN Mask:\n", nan_mask)

以下是得到的结果 −

Original Array:
[1.  2.5 nan 4.7 nan 6.2]
NaN Mask:
 [False False  True False  True False]

多维数组中识别缺失值

在多维数组中识别缺失值指的是检测数组各个维度中的 NaN 值,例如在 2D 矩阵或 3D 张量中。

这一过程类似于处理 1D 数组,但需要处理多个维度,同时保持对缺失值位置的清晰性。

示例

在本示例中,我们使用 np.isnan() 函数创建一个掩码,用于识别 2D 数组中的 NaN 值 −

import numpy as np 

# 创建包含 NaN 值的 2D 数组
arr_2d = np.array([[1.0, np.nan, 3.5],
                   [np.nan, 5.1, 6.3]])

# 在 2D 数组中识别 NaN 值
nan_mask_2d = np.isnan(arr_2d)

print("Original 2D Array:\n", arr_2d)
print("NaN Mask 2D:\n", nan_mask_2d)

这将产生以下结果 −

Original 2D Array:
[[1.  nan 3.5]
 [nan 5.1 6.3]]
NaN Mask 2D:
[[False  True False]
[ True False False]]

结构化数组中识别缺失值

在结构化数组中识别缺失值涉及检测数组字段内的 NaN 或其他占位符,特别是当数组包含混合数据类型和多个字段时。

结构化数组很复杂,因为每个字段可以有自己的数据类型,因此处理缺失值需要分别关注每个字段。

示例

在下面的示例中,我们使用 np.isnan() 函数创建一个掩码,专门识别结构化数组的 'age' 字段中的 NaN 值 −

import numpy as np

# 创建包含 NaN 值的结构化数组
dtype = [('name', 'U10'), ('age', 'f8')]
structured_arr = np.array([('Alice', 25), ('Bob', np.nan), ('Cathy', 23)], dtype=dtype)

# 检查 'age' 字段中的 NaN 值
nan_mask_structured = np.isnan(structured_arr['age'])

print("Structured Array:\n", structured_arr)
print("NaN Mask for 'age' field:\n", nan_mask_structured)

以上代码的输出如下 −

Structured Array:
[('Alice', 25.) ('Bob', nan) ('Cathy', 23.)]
NaN Mask for 'age' field:
[False  True False]

数组中缺失值的计数

要确定数组中缺失值的数量,可以使用 np.isnan() 函数,它返回一个布尔数组,指示 NaN 值的位置。

这个布尔数组中的每个元素如果对应原始数组中的元素是 NaN,则为 "True",否则为 "False"。通过对这个布尔数组求和,你实际上就是在统计 True 值的数量,这对应于缺失值的数量。

示例

在以下示例中,我们使用 np.isnan() 函数生成一个布尔掩码来识别数组中的 NaN 值。然后通过对掩码求和来统计 NaN 值的数量,从而得到缺失值的总数 −

import numpy as np

# 创建一个包含一些 NaN 值的数组
arr = np.array([1.0, 2.0, np.nan, 4.0, np.nan])

# 生成指示 NaN 值的布尔数组
nan_mask = np.isnan(arr)

# 统计 NaN 值的数量
nan_count = np.sum(nan_mask)

print("NaN 值的布尔掩码:")
print(nan_mask)
print("NaN 值的数量:")
print(nan_count)

得到如下输出 −

Boolean mask of NaN values:
[False False  True False  True]
Number of NaN values:
2

使用 np.isnan() 函数进行布尔索引

一旦使用 np.isnan() 函数识别出缺失值,你就可以结合布尔索引对这些值执行各种操作。

布尔索引允许你基于条件(例如,元素是否为 NaN)创建一个掩码,然后使用这个掩码来过滤、替换或分析满足该条件的元素。

示例:过滤缺失值

你可以使用布尔索引从数组中过滤掉缺失值,只保留非缺失值 −

import numpy as np

# 创建一个包含一些 NaN 值的数组
arr = np.array([1.0, 2.0, np.nan, 4.0, np.nan])

# 生成指示 NaN 值的布尔数组
nan_mask = np.isnan(arr)

# 过滤掉 NaN 值
filtered_arr = arr[~nan_mask]

print("原始数组:")
print(arr)
print("过滤后的数组(不含 NaN 值):")
print(filtered_arr)

执行上述代码后,我们得到以下输出 −

Original array:
[ 1.  2. nan  4. nan]
Filtered array (without NaN values):
[1. 2. 4.]

示例:替换缺失值

你可以用特定值替换 NaN 值,例如非缺失值的均值或中位数 −

import numpy as np

# 创建一个包含一些 NaN 值的数组
arr = np.array([1.0, 2.0, np.nan, 4.0, np.nan])

# 计算非 NaN 值的均值
mean_value = np.nanmean(arr)

# 用均值替换 NaN 值
arr_with_replacement = np.where(np.isnan(arr), mean_value, arr)

print("原始数组:")
print(arr)
print("用均值替换 NaN 的数组:")
print(arr_with_replacement)

产生的结果如下 −

Original array:
[ 1.  2. nan  4. nan]
Array with NaN replaced by mean:
[1.         2.         2.33333333 4.         2.33333333]

示例:分析缺失值

你可以使用布尔索引来分析缺失值的分布或模式,例如检查哪些行或列有缺失数据 −

import numpy as np

# 创建一个包含一些 NaN 值的 2D 数组
arr_2d = np.array([[1.0, np.nan, 3.0],
                   [4.0, np.nan, 6.0],
                   [np.nan, 8.0, 9.0]])

# 识别 NaN 值
nan_mask_2d = np.isnan(arr_2d)

# 统计每行的 NaN 值数量
nan_count_per_row = np.sum(nan_mask_2d, axis=1)

print("原始 2D 数组:")
print(arr_2d)
print("每行 NaN 数量:")
print(nan_count_per_row)

我们得到如下输出 −

Original 2D array:
[[ 1. nan  3.]
 [ 4. nan  6.]
 [nan  8.  9.]]
NaN count per row:
[1 1 1]