圧倒的成長

日々の備忘録

この歳でnumpyで詰まった

numpy, 暗黙の型変換をいつもしてくれると思っていたが、そんなことなかった。

import numpy as np
x = np.ones((1,), dtype=np.uint8)
x *= 127
x = x - 128
print(x)

-1になってくれると思うじゃないですか。

[255]

オーバーフローするのね・・・

numpy演算のときも、普通のPythonの演算時と同様、演算に用いられるオペランドの型によって演算結果の型が決まるらしく、 uint8の変数xに対して下手に x - 128なんて演算をしてしまうと両方uint8として処理されてオーバーフローする。このしょーもないミスでずっと欲しい値が出なかった。 まぁいつもx - 128.みたいに明示的に浮動小数点で計算するように書けば済む話だった。楽しようと思ってはいけないということか・・・

でもまぁそこはさぁ、オーバーフローさせずに型変換してくれよ!?このご時世意図的にオーバーフローさせる人いる!?

しかも、

x = np.ones((1,), dtype=np.uint8)
x *= 127
x = x / 128
print(x)

当然0だと思いきや・・・

array([0.9921875])

そっちは変換するんかい!

追記 除算時に暗黙の型変換が起こったのはPython3だから。Python2.7ではちゃんと0になった。 これに限らず最近は型指定の重要さを強く感じる。あとメモリ管理。 それにしてもすごい初心者っぽい記事だ。何年numpyインポートしてるんだって話だ。