NumPyで数値を思い通りに丸める!np.roundの四捨五入・偶数丸めテクニック


 

データ分析や数値計算において、小数を丸めて整数にしたり、特定の小数点以下の桁数に調整したりする操作は頻繁に行われます。NumPyの**np.round**関数は、この丸め処理を効率的に行うための非常に便利なツールです。この記事では、np.roundの基本的な使い方から、四捨五入(Nearest Even/Half-to-Even、つまり偶数丸め)の挙動、そして小数点以下の桁数を指定する方法まで、具体的なサンプルコードを交えながら詳しく解説します。


 

np.roundとは?

 

np.roundは、NumPy配列の各要素を最も近い整数、または指定した小数点以下の桁数に丸める関数です。Pythonの組み込み関数round()と同様の機能を提供しますが、NumPy配列全体に対して高速に適用できる点が特徴です。

 

書式

 

Python
 
numpy.round(a, decimals=0, out=None)
  • a: 丸めたい元の配列(ndarray)、または数値。

  • decimals: 丸める小数点以下の桁数を指定します。

    • 0 (デフォルト): 最も近い整数に丸めます。

    • 正の整数: 指定した小数点以下の桁数に丸めます。

    • 負の整数: 小数点より左の桁数(例: -1で1の位、-2で10の位)に丸めます。

  • out (オプション): 結果を格納する配列。指定しない場合は新しい配列が作成されます。


 

np.roundの基本的な使い方

 

 

1. 小数点以下を丸めて整数にする (decimals=0)

 

デフォルトでは、最も近い整数に丸められます。.5の場合の挙動が**偶数丸め(Nearest Even/Half-to-Even)**である点に注意が必要です。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([1.4, 1.5, 2.5, 3.6, -1.5, -2.5])

# 小数点以下を丸めて整数にする (デフォルト)
rounded_arr = np.round(arr)
print("デフォルトの丸め (decimals=0):\n", rounded_arr)

 

出力例

 

デフォルトの丸め (decimals=0):
 [ 1.  2.  2.  4. -2. -2.]

偶数丸めについて補足:

1.5 -> 2.0 (最も近い偶数)

2.5 -> 2.0 (最も近い偶数)

-1.5 -> -2.0 (最も近い偶数)

-2.5 -> -2.0 (最も近い偶数)

これは、統計的な偏りを避けるための標準的な丸め方です。一般的な「四捨五入」(0.5を常に切り上げ)とは異なることに注意してください。一般的な四捨五入を行いたい場合は、np.round(arr + 0.5)np.floor(arr + 0.5)といった工夫が必要になります。


 

2. 特定の小数点以下の桁数に丸める (正のdecimals)

 

decimals引数に正の整数を指定すると、指定した桁数まで丸められます。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([3.14159, 2.71828, 1.61803])

# 小数点以下2桁に丸める
rounded_2_digits = np.round(arr, decimals=2)
print("小数点以下2桁に丸めた配列:", rounded_2_digits)

 

出力例

 

小数点以下2桁に丸めた配列: [3.14 2.72 1.62]

 

3. 小数点より上の桁数に丸める (負のdecimals)

 

decimals引数に負の整数を指定すると、小数点より左の桁数(例: -1で1の位、-2で10の位)に丸めることができます。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([123.45, 678.90, 99.99])

# 1の位で丸める (10の倍数に)
rounded_to_tens = np.round(arr, decimals=-1)
print("1の位で丸めた配列:", rounded_to_tens)

 

出力例

 

1の位で丸めた配列: [120. 680. 100.]

 

4. 多次元配列での使用

 

np.roundは多次元配列に対しても要素ごとに丸め処理を行い、元の形状を維持した新しい配列を返します。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[1.23, 4.56, 7.89],
                   [10.1, 11.5, 12.9]])
print("元の配列:\n", arr_2d)

# 小数点以下1桁に丸める
rounded_arr_2d = np.round(arr_2d, decimals=1)
print("\n小数点以下1桁に丸めた配列:\n", rounded_arr_2d)

 

出力例

 

元の配列:
 [[ 1.23  4.56  7.89]
 [10.1  11.5  12.9 ]]

小数点以下1桁に丸めた配列:
 [[ 1.2  4.6  7.9]
 [10.1 11.5 12.9]]

 

まとめ

 

np.roundは、NumPy配列内の数値を効率的に丸めるための中心的な関数です。

  • 柔軟な丸め方: decimals引数を使って、小数点以下任意の桁数、または小数点より上の桁数で丸めることができます。

  • 偶数丸め(Nearest Even): .5の値を丸める際のデフォルトの挙動は、統計的な偏りを防ぐための「偶数丸め」であることに留意しましょう。一般的な四捨五入とは異なる場合があります。

  • 多次元配列対応: 多次元配列の全要素に対して一括で丸め処理を適用し、元の形状を維持します。

データの前処理、結果の表示、特定の精度要件を満たす数値計算など、様々な場面でnp.roundは非常に役立ちます。ぜひ、あなたのNumPyワークフローに取り入れてみてください!