Python 中的 NaN(Not a Number)詳解:新手指南
更新日期: 2024 年 9 月 18 日
在數值計算和資料處理中,我們經常會遇到無法表示或未定義的數值。
Python 提供了一個特殊的浮點數值 NaN(Not a Number)來表示這類情況。
本文將為新手詳細介紹 Python 中的 NaN,包括其定義、用法和注意事項,幫助您在實際編碼中正確處理。
什麼是 NaN
NaN 是一個特殊的浮點數值,用於表示未定義或不可表示的數值結果,例如:
- 零除以零:0/0
- 無效的數學運算:如在實數域中計算 sqrt(-1)
- 缺失或無效的資料:在資料集中表示缺失值
在 Python 中,NaN 常用於表示資料中的空值或錯誤值,特別是在科學計算和資料分析中。
如何在 Python 中使用 NaN
使用內建的 float 類型
nan_value = float('nan')
print(nan_value) # 輸出:nan
使用 math 模組
import math
nan_value = math.nan
print(nan_value) # 輸出:nan
使用 numpy 模組
import numpy as np
nan_value = np.nan
print(nan_value) # 輸出:nan
NaN 的特性
NaN 不等於任何值,包括它自己
nan_value = float('nan')
print(nan_value == nan_value) # 輸出:False
print(nan_value != nan_value) # 輸出:True
由於 NaN 不等於任何值,因此使用傳統的比較運算符無法判斷一個值是否為 NaN。
NaN 在運算中會傳播
print(nan_value + 10) # 輸出:nan
print(nan_value * 2) # 輸出:nan
一旦運算中出現 NaN,結果也將是 NaN。
如何檢測 NaN
使用 math.isnan()
import math
print(math.isnan(nan_value)) # 輸出:True
使用 numpy.isnan()
import numpy as np
print(np.isnan(nan_value)) # 輸出:True
注意:不要使用等號比較
由於 NaN != NaN,所以無法通過 == 或 != 來判斷。
NaN 的實際應用
處理缺失資料
在資料分析中,NaN 常用於表示缺失值。
data = [1, 2, float('nan'), 4, 5]
為了計算平均值,需要過濾掉 NaN。
import math
clean_data = [x for x in data if not math.isnan(x)]
average = sum(clean_data) / len(clean_data)
print(average) # 輸出:3.0
異常處理
在數學計算中,如果結果無法定義,可以返回 NaN。
def safe_divide(a, b):
try:
return a / b
except ZeroDivisionError:
return float('nan')
result = safe_divide(10, 0)
print(result) # 輸出:nan
六、注意事項
與 None 的區別
- NaN:屬於 float 類型,用於表示未定義的數值。
- None:屬於 NoneType,用於表示空值或缺失的物件。
print(type(float('nan'))) # 輸出:<class 'float'>
print(type(None)) # 輸出:<class 'NoneType'>
比較操作中的問題
在排序或比較時,需要特別處理 NaN。
data = [3, float('nan'), 2, 5]
data.sort()
print(data) # 輸出可能不如預期
建議在排序前過濾或處理 NaN 值。
NaN 與浮點數精度
需要注意的是,浮點數的計算精度可能導致意外的 NaN
。
import math
result = math.sqrt(-0.0000000000000001)
print(result) # 輸出:nan
在進行精度要求高的計算時,建議使用 decimal 模組。
總結
NaN 在 Python 中是處理未定義或無效數值的重要工具。
了解其特性和使用方法,能夠幫助您在資料處理和科學計算中更加高效。
記得在判斷和處理時,使用專門的函數如 math.isnan(),而非等號比較。
推薦閱讀: