note.nkmk.me

NumPy配列ndarrayの小数点以下を切り捨て・切り上げ: floor, trunc, ceil

Posted: 2021-05-22 / Tags: Python, NumPy

浮動小数点数floatのNumPy配列ndarrayの小数点以下を切り捨てたり切り上げたりするには、np.floor(), np.trunc(), np.ceil()などを使う。

負の値も考慮すると、端数処理(切り捨て・切り上げ)には4種類ある。

ここでは以下の内容を説明する。

  • ndarrayの小数点以下切り捨て: np.floor(), np.trunc()など
    • 負の無限大への丸め: np.floor()
    • 0への丸め: np.trunc(), np.fix(), intにキャスト
  • ndarrayの小数点以下切り上げ: np.ceil()など
    • 正の無限大への丸め: np.ceil()
    • 無限大への丸め

なお、四捨五入(厳密には偶数への丸め)にはnp.rint(), np.around()を使う。

Pythonの標準ライブラリmathによる小数点以下の切り捨て・切り上げについては以下の記事を参照。

以下のnumpy.ndarrayを例とする。

import numpy as np

print(np.__version__)
# 1.19.4

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]]
スポンサーリンク

ndarrayの小数点以下切り捨て: np.floor(), np.trunc()など

負の無限大への丸め: np.floor()

負の無限大への丸めにはnp.floor()を使う。要素ごとに処理される。整数(小数点以下が0)の値はそのまま。

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()を使う。

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()を使う。

print(np.ceil(a))
# [[ 10.  11.  11.]
#  [-10. -10. -10.]]

無限大への丸め

バージョン1.20時点で無限大への丸めの関数は提供されていないが、例えば以下のように実現できる(もっといい方法があるかもしれない)。

print(np.copysign(np.ceil(np.abs(a)), a))
# [[ 10.  11.  11.]
#  [-10. -11. -11.]]

np.abs()で絶対値に変換してからnp.ceil()で切り上げて、np.copysign()で元の符号に戻している。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事