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(),而非等號比較。

推薦閱讀:

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *