25_NumPy數組np.round將ndarray舍入為偶數
使用 np.round() 將 NumPy 數組 ndarray 的元素值舍入為任意位數。請注意,0.5 由于舍入到偶數而不是一般舍入而舍入為 0.0。
本文介紹了一般舍入的實現示例。
- 如何使用 np.round()
- 基本用法
- 指定要舍入的位數:參數decimals
- np.round() 舍入為偶數
- np.round() 和 Python 內置函數 round() 的區別
- np.around() 和 ndarray 的 round() 方法
- 四舍五入的實現示例
- np.rint() 四舍五入為整數
如何使用 np.round()
基本用法
np.round() 返回一個 ndarray,該 ndarray 對指定 ndarray 的每個元素進行四舍五入。默認情況下,數字四舍五入到小數點后 0 位。
a = np.array([12.3, 45.6, 78.9])print(np.round(a))
# [12. 46. 79.]print(np.round(a).dtype)
# float64
返回與原始類型相同的 ndarray。如上例所示,如果源是浮點數 float,則即使小數點右側的位數為 0,也會返回浮點數 float 的 ndarray。
print(np.round(a).astype(int))
# [12 46 79]print(a.astype(int))
# [12 45 78]
也可以指定列表等類似數組的對象,但返回值是ndarray。
l = [12.3, 45.6, 78.9]print(np.round(l))
# [12. 46. 79.]print(type(np.round(l)))
# <class 'numpy.ndarray'>
還可以指定標量值。
print(np.round(12.3))
# 12.0
指定要舍入的位數:參數decimals
指定要舍入為第二個參數小數中的整數值的位數。默認為小數=0。 指定正整數指定小數點后的位數,指定負整數指定整數的位數(位數)。 -1 四舍五入到十位,-2 四舍五入到百位。
print(np.round(123.456))
# 123.0print(np.round(123.456, 2))
# 123.46print(np.round(123.456, -2))
# 100.0
對于整數 int,如果為小數參數指定負值,它將四舍五入到所需的數字。如果指定 0 或正值,則不會發生任何變化。如果源是整型 int,則返回值也是整型 int。
print(np.round(123456))
# 123456print(np.round(123456, 2))
# 123456print(np.round(123456, -2))
# 123500a = np.array([12345, 67890])print(np.round(a, -3))
# [12000 68000]print(np.round(a, -3).dtype)
# int64
np.round() 舍入為偶數
使用 np.round() 進行舍入不是一般舍入,而是舍入到偶數。
0.5 舍入為 0.0,2.5 舍入為 2.0,等等。
print(np.round([-3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5]))
# [-4. -2. -2. -0. 0. 2. 2. 4.]print(np.round([-350, -250, -150, -50, 50, 150, 250, 350], -2))
# [-400 -200 -200 0 0 200 200 400]
當分數恰好為 0.5 時,會舍入為偶數,因此例如,2.5 將舍入為 2.0,但 2.51 將舍入為 3.0。
print(np.round([2.49, 2.5, 2.51]))
# [2. 2. 3.]print(np.round([249, 250, 251], -2))
# [200 200 300]
np.round() 和 Python 內置函數 round() 的區別
還可以使用Python的內置函數round()對值進行舍入。 np.round() 和 round() 都四舍五入為偶數,并且使用方式相同,例如指定要四舍五入的位數作為參數,但結果可能會根據值的不同而有所不同。
print(np.round(0.15, 1))
# 0.2print(round(0.15, 1))
# 0.1
引用中的 np.true_divide() 是一個相當于 / 運算符的函數。 np.rint() 稍后會解釋。 如果你通過增加顯示位數來檢查,浮點數0.15實際上是0.14999…,如果你準確地處理浮點數,四舍五入到0.1是正確的。
print(f'{0.15:.20}')
# 0.14999999999999999445
官方文檔中還列出了其他示例。
print(np.round(56294995342131.5, 3))
# 56294995342131.51print(round(56294995342131.5, 3))
# 56294995342131.5
np.around() 和 ndarray 的 round() 方法
np.around() 被定義為 np.round() 的別名。用法是一樣的。
a = np.array([12.3, 45.6, 78.9])print(np.around(a))
# [12. 46. 79.]print(np.around(a, -1))
# [10. 50. 80.]
另外,round() 被定義為 ndarray 的方法。
print(a.round())
# [12. 46. 79.]print(a.round(-1))
# [10. 50. 80.]
四舍五入的實現示例
下面顯示了實現一般舍入的函數的示例。 參數小數可以像 np.round() 一樣指定。對齊位數后,加上 0.5,使用 np.floor() 將小數點四舍五入(四舍五入到負無窮大),并返回位數。
def my_round(x, decimals=0):return np.floor(x * 10**decimals + 0.5) / 10**decimalsa = np.array([-3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5])print(np.round(a))
# [-4. -2. -2. -0. 0. 2. 2. 4.]print(my_round(a))
# [-3. -2. -1. 0. 1. 2. 3. 4.]print(a / 10)
# [-0.35 -0.25 -0.15 -0.05 0.05 0.15 0.25 0.35]print(np.round(a / 10, 1))
# [-0.4 -0.2 -0.2 -0. 0. 0.2 0.2 0.4]print(my_round(a / 10, 1))
# [-0.3 -0.2 -0.1 0. 0.1 0.2 0.3 0.4]
在上面的函數中,-0.5 變為 0.0。如果要將 -0.5 更改為 -1.0,請執行以下操作。使用 np.abs() 計算絕對值并使用 np.sign() 返回原始符號。
def my_round2(x, decimals=0):return np.sign(x) * np.floor(np.abs(x) * 10**decimals + 0.5) / 10**decimalsprint(a)
# [-3.5 -2.5 -1.5 -0.5 0.5 1.5 2.5 3.5]print(my_round(a))
# [-3. -2. -1. 0. 1. 2. 3. 4.]print(my_round2(a))
# [-4. -3. -2. -1. 1. 2. 3. 4.]print(a / 10)
# [-0.35 -0.25 -0.15 -0.05 0.05 0.15 0.25 0.35]print(my_round(a / 10, 1))
# [-0.3 -0.2 -0.1 0. 0.1 0.2 0.3 0.4]print(my_round2(a / 10, 1))
# [-0.4 -0.3 -0.2 -0.1 0.1 0.2 0.3 0.4]
np.rint() 四舍五入為整數
還提供 np.rint() 來舍入為整數。處理相當于 np.round(),decimals = 0。
可以指定類似數組的對象(例如 ndarrays 和列表)以及標量值。
a = np.array([12.3, 45.6, 78.9])print(np.rint(a))
# [12. 46. 79.]l = [12.3, 45.6, 78.9]print(np.rint(l))
# [12. 46. 79.]print(np.rint(12.3))
# 12.0
雖然叫rint,但并沒有轉換為整數int,而是返回一個與原始類型相同類型的ndarray。
print(np.rint(a).dtype)
# float64
與 np.round() 一樣,四舍五入到偶數而不是一般四舍五入。
print(np.rint([-3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5]))
# [-4. -2. -2. -0. 0. 2. 2. 4.]