python | numpy小記(四):理解 NumPy 中的 `np.round`:銀行家舍入策略
- 一、函數簽名與參數說明
- 二、“銀行家舍入”策略
- 三、基礎示例
- 四、與 Python 內建 `round` 的異同
- 五、使用注意事項
- 六、擴展用法:自定義舍入策略
- 七、總結
在科學計算與數據處理的過程中,經常需要對浮點數做四舍五入操作。NumPy 提供的 np.round
(別名 np.around
)函數,能夠非常方便地對數組或標量逐元素執行四舍五入,并支持靈活的參數設置。本文將從函數簽名、核心參數、舍入規則、示例演示、與 Python 內建 round
的區別等多角度,帶你深入理解并高效使用 np.round
。
一、函數簽名與參數說明
numpy.round(a, decimals=0, out=None)
# 等價于
numpy.around(a, decimals=0, out=None)
-
a
(array_like
)
輸入數據:可以是 Python 標量(如float
、int
)、列表,也可以是任意維度的 NumPy 數組。 -
decimals
(int
, 可正可負,默認0
)0
:舍入到最接近的整數- 正整數
n
:保留小數點后n
位 - 負整數
-n
:小數點左移n
位后舍入(如-1
表示十位取整,-2
表示百位取整)
-
out
(ndarray
, 可選)
指定一個預先分配好的數組,用于就地存放結果;若不提供,則返回一個新數組。
二、“銀行家舍入”策略
NumPy 的 np.round
遵循“銀行家舍入”(Round half to even)規則:
-
當待舍入值正好落在兩個可表示數的中點(如
2.5
、?1.5
)時,“舍入到偶數”那一側:np.round(2.5) # → 2.0 (2 是偶數) np.round(3.5) # → 4.0 (4 是偶數) np.round(-1.5) # → -2.0
-
對于其他不在中點的值,則執行常規的“四舍五入”:
np.round(2.49) # → 2.0 np.round(2.51) # → 3.0
這種策略能夠在大批量運算中減少結果的系統偏向,有助于提高數值穩定性。
三、基礎示例
-
對標量取整
import numpy as npprint(np.round(3.14159)) # 3.0 print(np.round(-2.71828, 2)) # -2.72 print(np.round(15.0, -1)) # 20.0 (十位取整)
-
對一維數組四舍五入
arr = np.array([0.1234, 1.5678, 2.5, -1.5]) # 保留兩位小數 print(np.round(arr, 2)) # 輸出: [ 0.12 1.57 2. -2. ]
-
對多維數組 + 負 decimals
mat = np.array([[12.3, 45.6],[78.9, 10.1]]) # 十位取整 print(np.round(mat, -1)) # 輸出: # [[10. 50.] # [80. 10.]]
-
就地更新(使用
out
)data = np.array([1.234, 2.345, 3.456]) np.round(data, 1, out=data) print(data) # [1.2 2.3 3.5]
四、與 Python 內建 round
的異同
比較項 | 內建 round(x, n) | np.round(a, n) |
---|---|---|
支持類型 | 單個數值(float /int ) | 支持標量與數組 (ndarray ) |
舍入規則 | “銀行家舍入” | “銀行家舍入” |
批量操作 | 需使用列表/推導顯式循環 | 自動對數組中每個元素逐一舍入,支持廣播與 out |
性能 | 逐個調用,數組處理需顯式 Python 循環,性能較低 | 底層 C 實現,支持向量化,高效處理大規模數據 |
五、使用注意事項
-
浮點精度噪聲
由于浮點二進制表示的限制,某些十進制小數無法完美存儲,四舍五入后可能出現0.15000000000000002
之類的細微偏差。 -
整數輸入
如果輸入數組為整數類型,NumPy 會先將其轉換為float64
再進行舍入。 -
負零 (
-0.0
)
對負數做四舍五入可能產生-0.0
,但在數值比較時與0.0
等價。
六、擴展用法:自定義舍入策略
如果需要其他類型的舍入策略(如“總是向上”、“總是向下”),可以結合 NumPy 的 np.floor
和 np.ceil
進行實現:
# 向下取整
floored = np.floor(arr)# 向上取整
ceiled = np.ceil(arr)# 自定義“四舍六入”:先加 0.1,再 round
custom = np.round(arr + 0.1)
七、總結
np.round
是 NumPy 中對標量與數組進行批量四舍五入的主要接口,支持保留任意小數位與負位移舍入。- 默認采用“銀行家舍入”策略,可以降低大規模運算的偏差積累。
- 通過
decimals
與out
參數,可以靈活控制舍入精度與就地更新行為。 - 對于特殊舍入需求,還可配合
np.floor
、np.ceil
等函數實現定制化策略。
希望這篇博客能幫助你徹底掌握 np.round
的原理與用法,在日常數據處理與科學計算中游刃有余。如果你有更多心得或疑問,歡迎在評論區留言交流!