【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になる」のような落とし穴もあるようです。

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

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

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

フクロウ

フクロウ

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