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

# Creating an array with NaN values
arr = np.array([1.0, 2.5, np.nan, 4.7, np.nan, 6.2])

# Identifying NaN values using np.isnan()
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 值,例如在二维矩阵或三维张量中。

此过程类似于处理一维数组,但是需要处理多个维度,同时要清楚缺失值的位置。

示例

在这个例子中,我们使用 np.isnan() 函数创建一个掩码来识别二维数组中的 NaN 值:

import numpy as np 

# Creating a 2D array with NaN values
arr_2d = np.array([[1.0, np.nan, 3.5],
                   [np.nan, 5.1, 6.3]])

# Identifying NaN values in the 2D array
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

# Creating a structured array with NaN values
dtype = [('name', 'U10'), ('age', 'f8')]
structured_arr = np.array([('Alice', 25), ('Bob', np.nan), ('Cathy', 23)], dtype=dtype)

# Checking for NaN values in the 'age' field
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

# Create an array with some NaN values
arr = np.array([1.0, 2.0, np.nan, 4.0, np.nan])

# Generate a boolean array indicating NaN values
nan_mask = np.isnan(arr)

# Count the number of NaN values
nan_count = np.sum(nan_mask)

print("Boolean mask of NaN values:")
print(nan_mask)
print("Number of NaN values:")
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

# Create an array with some NaN values
arr = np.array([1.0, 2.0, np.nan, 4.0, np.nan])

# Generate a boolean array indicating NaN values
nan_mask = np.isnan(arr)

# Filter out NaN values
filtered_arr = arr[~nan_mask]

print("Original array:")
print(arr)
print("Filtered array (without NaN values):")
print(filtered_arr)

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

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

示例:替换缺失值

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

import numpy as np

# Create an array with some NaN values
arr = np.array([1.0, 2.0, np.nan, 4.0, np.nan])

# Calculate the mean of non-NaN values
mean_value = np.nanmean(arr)

# Replace NaN values with the mean value
arr_with_replacement = np.where(np.isnan(arr), mean_value, arr)

print("Original array:")
print(arr)
print("Array with NaN replaced by mean:")
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

# Create a 2D array with some NaN values
arr_2d = np.array([[1.0, np.nan, 3.0],
                   [4.0, np.nan, 6.0],
                   [np.nan, 8.0, 9.0]])

# Identify NaN values
nan_mask_2d = np.isnan(arr_2d)

# Count NaN values per row
nan_count_per_row = np.sum(nan_mask_2d, axis=1)

print("Original 2D array:")
print(arr_2d)
print("NaN count per row:")
print(nan_count_per_row)

我们将得到如下所示的输出:

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