Pythonで、以前から「VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future」という警告が出て、なんだろうなと思っていたのですが、どうやら意図せずして要素数がfloatに、つまりary[3]となるべきところがary[3.0]のような状況になっていました。python3では6/2=3.0なんですね。
除算すると小数に
Python3では、普通に / を用いて除算すると、整数同士でもfloatになるようです。具体的には、6/2 = 3.0 となります。これを避けるには、 / ではなく // を用います。すると、6//2 = 3 です。また、7//2 = 3です。正直こちらの挙動のほうが馴染みがあります…。
これは有名というか当たり前なんでしょうけれど、恥ずかしながら知りませんでした(参考:「Python 3ではまったこと - minus9d's diary」)。環境によって警告が出たり出なかったりしたのは、バージョン違いによるものだったのか…。
警告というか、本来エラーが出るべきところです。実際、通常はエラーです。が、私は今回numpyを使っていて、numpyだとary[3.0]のように書いてもちゃんと処理してくれるようなのです。が、間違いは間違いなので、警告が出る、といったところでしょうか。
numpy.onesはデフォルトfloat64
もう一つnumpy絡みで。numpy.ones — NumPy v1.11 Manualによると、numpy.onesはデフォルト値がfloat64。なので、numpy.onesを演算に組み込むと、値がfloatになってしまいます。これも引っかかりました。整数の演算に組むこむのであれば、dtypeでintを指定してやらないといけません。
動的型付け言語は便利ですが、意識しなくてよいわけではないですしね。こういう間違いをすると凹みます。
コメント