【NumPy入門 np.round】配列の要素を四捨五入する方法と、0.5は0か1か問題

この記事では「NumPyの配列の各要素を四捨五入する関数」np.roundについて紹介します。

np.roundで大切なのは二つ

  1. 第二引数で四捨五入する桁をコントロールできる
  2. 実は四捨五入ではなく偶数丸め

この二つがわかるのならば、この記事の内容は既にわかっていると思います。

「何いってんだ?」って思ったあなた!ぜひこの記事でnp.roundの使い方を覚えちゃいましょう!

目次

np.round関数の使い方

※この記事のコードは、jupyter notebookjuputer 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になる」のような落とし穴もあるようです。

こういう細かい仕様は覚えておくと良いんですが、結構忘れることもあると思います。

多くの場合、忘れても調べてすぐ使いこなせればいいので、その度にこの記事を思い出していただけると嬉しいです。

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次