スライドショー

【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

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

フクロウ

フクロウ

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説