NumPy - 识别缺失值
数组中识别缺失值
在数组中识别缺失值意味着找到数据缺失的位置,在 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]