NumPyで小数点を自在に操作!floor, trunc, ceilで切り捨て・切り上げ
データ分析や数値計算を行う際、NumPy配列(ndarray)に格納された浮動小数点数を、特定のルールに基づいて整数に変換したい場面はよくあります。例えば、数値を切り捨てて整数部分だけを取り出したり、常に切り上げたりといった処理です。このような丸め操作に特化したNumPyの関数として、np.floor, np.trunc, **np.ceil**があります。この記事では、これらの関数の基本的な使い方とそれぞれの挙動の違いについて、具体的なサンプルコードを交えながら詳しく解説します。
NumPyの小数点操作関数の種類
NumPyには、数値の小数点以下を操作するためのいくつかの関数があります。それぞれ異なる丸め方をします。
np.floor(x): 要素の床関数を計算します。つまり、x以下の最大の整数を返します(負の数の場合は注意)。np.trunc(x): 要素の小数点以下を切り捨てます(ゼロ方向への丸め)。np.ceil(x): 要素の天井関数を計算します。つまり、x以上の最小の整数を返します。
np.floor():常に「切り捨て」(負の無限大方向への丸め)
np.floor()は、与えられた数値以下の最も大きい整数を返します。これは、数直線上を負の無限大方向に向かって進み、最初に見つかる整数に丸めるイメージです。
サンプルコード
import numpy as np
arr = np.array([2.7, 2.3, -2.7, -2.3, 0.5])
# 各要素を切り捨て (floor)
floored_arr = np.floor(arr)
print("元の配列:", arr)
print("floor()で切り捨て後の配列:", floored_arr)
出力例
元の配列: [ 2.7 2.3 -2.7 -2.3 0.5]
floor()で切り捨て後の配列: [ 2. 2. -3. -3. 0.]
ポイント: 負の数の場合、例えば-2.3の床関数は-3になります。これは-2.3以下の最大の整数が-3だからです。
np.trunc():小数点以下を「切り捨て」(ゼロ方向への丸め)
np.trunc()は、数値の小数点以下を単純に切り捨てて、整数部分のみを返します。正の数と負の数で挙動が異なります。
サンプルコード
import numpy as np
arr = np.array([2.7, 2.3, -2.7, -2.3, 0.5])
# 各要素の小数点以下を切り捨て (trunc)
truncated_arr = np.trunc(arr)
print("元の配列:", arr)
print("trunc()で切り捨て後の配列:", truncated_arr)
出力例
元の配列: [ 2.7 2.3 -2.7 -2.3 0.5]
trunc()で切り捨て後の配列: [ 2. 2. -2. -2. 0.]
ポイント: np.trunc()は常にゼロ方向への丸めを行います。
2.7->2-2.7 -> -2
これは、np.floor()とは負の数での挙動が異なります(-2.7のfloorは-3)。
np.ceil():常に「切り上げ」(正の無限大方向への丸め)
np.ceil()は、与えられた数値以上の最も小さい整数を返します。これは、数直線上を正の無限大方向に向かって進み、最初に見つかる整数に丸めるイメージです。
サンプルコード
import numpy as np
arr = np.array([2.7, 2.3, -2.7, -2.3, 0.5])
# 各要素を切り上げ (ceil)
ceiled_arr = np.ceil(arr)
print("元の配列:", arr)
print("ceil()で切り上げ後の配列:", ceiled_arr)
出力例
元の配列: [ 2.7 2.3 -2.7 -2.3 0.5]
ceil()で切り上げ後の配列: [ 3. 3. -2. -2. 1.]
ポイント: 負の数の場合、例えば-2.3の天井関数は-2になります。これは-2.3以上の最小の整数が-2だからです。
多次元配列への適用
これらの関数はすべて、多次元NumPy配列に対しても要素ごとに同様の丸め処理を行い、元の配列の形状を維持した新しい配列を返します。
サンプルコード
import numpy as np
arr_2d = np.array([[1.2, 3.8],
[-0.5, -2.1]])
print("元の配列:\n", arr_2d)
print("\nfloor()で切り捨て:\n", np.floor(arr_2d))
print("trunc()で小数点以下を切り捨て:\n", np.trunc(arr_2d))
print("ceil()で切り上げ:\n", np.ceil(arr_2d))
出力例
元の配列:
[[ 1.2 3.8]
[-0.5 -2.1]]
floor()で切り捨て:
[[ 1. 3.]
[-1. -3.]]
trunc()で小数点以下を切り捨て:
[[ 1. 3.]
[ 0. -2.]]
ceil()で切り上げ:
[[ 2. 4.]
[ 0. -2.]]
まとめ
NumPyのfloor, trunc, ceil関数は、浮動小数点数の丸め処理において異なるニーズに対応します。
np.floor(): 常に「負の無限大方向」に丸めます。負の数ではnp.trunc()と異なる結果になる場合があります。np.trunc(): 常に「ゼロ方向」に小数点以下を切り捨てます。絶対値が小さくなるように丸められます。np.ceil(): 常に「正の無限大方向」に切り上げます。
これらの関数を適切に使い分けることで、データの前処理、数値モデルの調整、表示フォーマットの制御など、様々な場面で柔軟な数値操作が可能になります。ぜひ、あなたのNumPyワークフローで活用してください!

