この記事では「NumPyの配列の各要素を四捨五入する関数」、np.roundについて紹介します。
np.roundで大切なのは二つ
- 第二引数で四捨五入する桁をコントロールできる
- 実は四捨五入ではなく偶数丸め
この二つがわかるのならば、この記事の内容は既にわかっていると思います。
「何いってんだ?」って思ったあなた!ぜひこの記事でnp.roundの使い方を覚えちゃいましょう!
np.round関数の使い方
※この記事のコードは、jupyter notebookやjuputer labを使って書かれています。
コードを試すときは是非これらやIPythonを使ってみてください。
基本的な使い方
np.round関数は四捨五入を行う関数です。
例えば浮動小数点数があったとき、これを0か1に丸めてくれます。
# コード In [1]: import numpy as np
# コード In [2]: a = np.random.random(10) a0 = np.round(a) print("original") print(a) print("\nround(original)") print(a0)
# 出力結果 [2]: original [0.74852934 0.84906089 0.22388901 0.8173411 0.1814382 0.7586746 0.96507658 0.41758639 0.19298934 0.65750282] round(original) [1. 1. 0. 1. 0. 1. 1. 0. 0. 1.]
第二引数decimalsで小数点第何位を四捨五入するかをコントロール
round関数は第二引数を指定することで、小数点第何位で四捨五入するかを変更する事ができます。
何も指定しないと0になっています(小数点以下四捨五入)が、例えば1や2といった値を指定する事もできます。
decimals=1で小数点第2位を四捨五入する
# コード In [3]: a1 = np.round(a, decimals=1) print("original") print(a) print("\nround(original)") print(a1)
# 出力結果 [3]: original [0.74852934 0.84906089 0.22388901 0.8173411 0.1814382 0.7586746 0.96507658 0.41758639 0.19298934 0.65750282] round(original) [0.7 0.8 0.2 0.8 0.2 0.8 1. 0.4 0.2 0.7]
decimals=2で小数点第3位を四捨五入する
# コード In [4]: a1 = np.round(a, decimals=2) print("original") print(a) print("\nround(original)") print(a1)
# 出力結果 [4]: original [0.74852934 0.84906089 0.22388901 0.8173411 0.1814382 0.7586746 0.96507658 0.41758639 0.19298934 0.65750282] round(original) [0.75 0.85 0.22 0.82 0.18 0.76 0.97 0.42 0.19 0.66]
np.round(0.5)は1?0?
ここでちょっとした脱線です。
四捨五入と表現するからには、普通0.5は1になると思いますよね。
でも実は……
# コード In [5]: np.round(0.5)
# 出力結果 Out [5]: 0.0
このように、0の方に丸めてしまうんです。
「じゃあNumPyでは~.5は全部小さい方になるんだ」
って考えたくなるのですが、これも実は間違い。
# コード In [6]: np.round(1.5)
# 出力結果 Out [6]: 2.0
上のように、今度は大きい方に丸めています。
これはどういうことかというと、「丸めたときに偶数になるようになっている」ということらしいです。
# コード In [7]: b = np.arange(0.5,10.5,) b0 = np.round(b) print("original") print(b) print("\nround(original)") print(b0)
# 出力結果 [7]: original [0.5 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5] round(original) [ 0. 2. 2. 4. 4. 6. 6. 8. 8. 10.]
これを「偶数丸め」「五捨五入」「銀行丸め」などと言うそうです。
利点もあるようですが、意外な落とし穴になりそうな仕様ですね。
参考:
まとめ
この記事では、numpy配列の要素を四捨五入する関数、np.roundについて解説しました。
基本的には小学校でならった四捨五入の通りですが、「0.5が0になる」のような落とし穴もあるようです。
こういう細かい仕様は覚えておくと良いんですが、結構忘れることもあると思います。
多くの場合、忘れても調べてすぐ使いこなせればいいので、その度にこの記事を思い出していただけると嬉しいです。