NumPy - 识别缺失值
识别数组中的缺失值
识别数组中的缺失值意味着找到数据缺失的位置,在 NumPy 中通常表示为 NaN(非数字)。您可以使用 NumPy 的 np.isnan() 函数识别数组中的缺失值。
NaN 是由 IEEE 浮点标准定义的特殊浮点值。它用于表示未定义或无法表示的值,例如 0/0 的结果或涉及 NaN 的数学运算。
使用 isnan() 函数
NumPy 中的 np.isnan() 函数用于识别数组中的 NaN(非数字)值。
此函数检查数组中的每个元素,并返回一个相同形状的布尔数组,其中如果原始数组中对应的元素为 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("原始数组: ", arr) print("NaN 掩码: ", nan_mask)
以下是得到的输出 -
原始数组: [1. 2.5 nan 4.7 nan 6.2] NaN 掩码: [False False True False True False]
识别多维数组中的缺失值
识别多维数组中的缺失值是指在数组的各个维度(例如二维矩阵或三维张量)中检测 NaN 值。
此过程类似于处理一维数组,但需要处理多个维度,同时保持缺失值位置的清晰度。
示例
在此示例中,我们使用 np.isnan() 函数创建一个掩码,用于识别二维数组中的 NaN 值 -
import numpy as np # 创建包含 NaN 值的二维数组 arr_2d = np.array([[1.0, np.nan, 3.5], [np.nan, 5.1, 6.3]]) # 识别二维数组中的 NaN 值 nan_mask_2d = np.isnan(arr_2d) print("原始二维数组: ", arr_2d) print("NaN 掩码二维数组: ", nan_mask_2d)
这将产生以下结果 -
原始二维数组: [[1. nan 3.5] [nan 5.1 6.3]] NaN 掩码二维数组: [[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_arr) print(""age"字段的 NaN 掩码: ",nan_mask_structured)
以下是上述代码的输出 -
结构化数组: [('Alice', 25.) ('Bob', nan) ('Cathy', 23.)] 'age' 字段的 NaN 掩码: [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)
输出结果如下 -
NaN 值的布尔掩码: [False False True False True] NaN 值的数量: 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)
执行上述代码后,我们得到以下输出 -
原始数组: [ 1. 2. nan 4. nan] 过滤后的数组(不含 NaN 值): [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)
结果如下 -
原始数组: [ 1. 2. nan 4. nan] 用平均值替换 NaN 的数组: [1. 2. 2.33333333 4. 2.33333333]
示例:分析缺失值
您可以使用布尔索引来分析缺失值的分布或模式,例如,检查哪些行或列有缺失数据 -
import numpy as np # 创建一个包含一些 NaN 值的二维数组 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("原始二维数组:") print(arr_2d) print("每行 NaN 值数量:") print(nan_count_per_row)
我们得到如下所示的输出 -
原始二维数组: [[ 1. nan 3.] [ 4. nan 6.] [nan 8. 9.]] 每行 NaN 值数量: [1 1 1]