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]
廣告