環境
numpy version:1.24.3
numpy arangeの沼
arangeのドキュメンテーションも参考に、次のコードがどのような数列を返すと思いますか?
for i in np.arange(3.0, 4.4, 0.1):
print(i)
想像するのは
3.0
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
4.0
4.1
4.2
4.3
こんな出力でしょう。しかし、実際に返されるのは次のような出力です。
3.0
3.1
3.2
3.3000000000000003
3.4000000000000004
3.5000000000000004
3.6000000000000005
3.7000000000000006
3.8000000000000007
3.900000000000001
4.000000000000001
4.100000000000001
4.200000000000001
4.300000000000001
4.400000000000001
そうなんです。arangeに指定した、endの値の4.4を超えます!!
これがarangeの沼です。つまり、丸目誤差のせいで思った挙動をせず不安定な挙動をします。enumerateと一緒に使って日には最悪です。out of rangeが返ってくるわけですから。
こちらにより詳しい解説がありますので、ご参照ください。
結論
上記url記事にもある通り、挙動の安定するnp.linspaceやrangeを使うようにしましょう。