NumPy配列ndarrayの小数点以下を切り捨て・切り上げ: floor, trunc, ceil
浮動小数点数float
のNumPy配列ndarray
の小数点以下を切り捨てたり切り上げたりするには、np.floor()
, np.trunc()
, np.ceil()
などを使う。
負の値も考慮すると、端数処理(切り捨て・切り上げ)には4種類ある。
- 端数処理 - 切り捨て・切り上げ - Wikipedia
- 0への丸め
- 無限大への丸め
- 負の無限大への丸め
- 正の無限大への丸め
それぞれの種類の処理について説明する。
四捨五入(厳密には偶数への丸め)にはnp.round()
やnp.rint()
を使う。
Pythonの標準ライブラリmathによる小数点以下の切り捨て・切り上げについては以下の記事を参照。
本記事のサンプルコードのNumPyのバージョンは以下の通り。バージョンによって仕様が異なる可能性があるので注意。
import numpy as np
print(np.__version__)
# 1.26.1
ndarrayの小数点以下切り捨て: np.floor(), np.trunc()など
負の無限大への丸め: np.floor()
負の無限大への丸めにはnp.floor()
を使う。要素ごとに処理される。整数(小数点以下が0)の値はそのまま。
a = np.array([[10.0, 10.1, 10.9], [-10.0, -10.1, -10.9]])
print(a)
# [[ 10. 10.1 10.9]
# [-10. -10.1 -10.9]]
print(np.floor(a))
# [[ 10. 10. 10.]
# [-10. -11. -11.]]
print(np.floor(a).dtype)
# float64
返り値のデータ型は浮動小数点数float
のままなので注意。整数int
に変換したい場合はさらにastype()
を使う。以降で説明するnp.trunc()
, np.ceil()
などでも同様。
print(np.floor(a).astype(int))
# [[ 10 10 10]
# [-10 -11 -11]]
スカラー値を引数に指定することも可能。これもnp.trunc()
, np.ceil()
などでも同様。
print(np.floor(10.1))
# 10.0
0への丸め: np.trunc(), np.fix(), intにキャスト
0への丸めにはnp.trunc()
を使う。
a = np.array([[10.0, 10.1, 10.9], [-10.0, -10.1, -10.9]])
print(a)
# [[ 10. 10.1 10.9]
# [-10. -10.1 -10.9]]
print(np.trunc(a))
# [[ 10. 10. 10.]
# [-10. -10. -10.]]
np.fix()
も同じく0への丸めとなる。np.trunc()
とnp.fix()
の違いは調べてもよく分からなかった。
print(np.fix(a))
# [[ 10. 10. 10.]
# [-10. -10. -10.]]
astype()
でデータ型を浮動小数点数float
から整数int
に変換(キャスト)した場合も0への丸めとなる。
print(a.astype(int))
# [[ 10 10 10]
# [-10 -10 -10]]
ndarrayの小数点以下切り上げ: np.ceil()など
正の無限大への丸め: np.ceil()
正の無限大への丸めにはnp.ceil()
を使う。
a = np.array([[10.0, 10.1, 10.9], [-10.0, -10.1, -10.9]])
print(a)
# [[ 10. 10.1 10.9]
# [-10. -10.1 -10.9]]
print(np.ceil(a))
# [[ 10. 11. 11.]
# [-10. -10. -10.]]
無限大への丸め
バージョン1.26
時点で無限大への丸めの関数は提供されていないが、例えば以下のように実現できる(もっといい方法があるかもしれない)。
a = np.array([[10.0, 10.1, 10.9], [-10.0, -10.1, -10.9]])
print(a)
# [[ 10. 10.1 10.9]
# [-10. -10.1 -10.9]]
print(np.copysign(np.ceil(np.abs(a)), a))
# [[ 10. 11. 11.]
# [-10. -11. -11.]]
np.abs()
で絶対値に変換してからnp.ceil()
で切り上げて、np.copysign()
で元の符号に戻している。