np.arange()
の罠
「Pythonを使って0.1ごとにfor文を回す – Kaggle Note」という記事があった。
for文を使って小数点を繰り返したい時ってたまにありますよね。今回はそれを実現する方法を書いていきます。0~1を0.1刻みで繰り返す想定です。
とあるとおりである。
記事では「rangeを使う方法」と「numpyを使う方法」とが掲げられている。
「rangeを使う方法」とは以下のようなものである。
def myrange():
gen = range(0, 10, 1)
return [i/10 for i in gen]
myrange()
# [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
これは問題のないコードだ。
つづいて、「numpyを使う方法」として以下のようなコードを掲げる。
import numpy as np
def myrange2():
data = np.arange(0.0, 1.0, 0.1)
data_round = np.round(data, 1)
return [i for i in data_round]
myrange2()
# [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
これはいけない。
今回の「0~1を0.1刻み」の場合たまたま偶然問題ないのだが、値が変わったら話が変わる。
「0~2.1を0.3刻み」を行ってみる。
まずは「rangeを使う方法」。
def myrange():
gen = range(0, 21, 3)
return [i/10 for i in gen]
myrange()
# [0.0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]
これが模範解答。
「numpyを使う方法」では以下のようになる。
import numpy as np
def myrange2():
data = np.arange(0.0, 2.1, 0.3)
data_round = np.round(data, 1)
return [i for i in data_round]
myrange2()
# [0.0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1]
おわかりいただけただろうか。終端が誤っているのだ。
np.arange()
のステップ数に小数を与えるべきではないのである。