A Day in the Life

numpy でキャスト時のオーバーフローの挙動が環境とデータサイズによって異なる

numpy のキャスト時のオーバーフローの挙動が環境とデータサイズによって異なってハマった(タイトルママ)。array のデータ長さが違うときで異なるパスを通るようで、原因解明に時間がかかってしまった。オーバーフローするデータをキャスト時に入れるな、というのが正しいのだろうけど…。挙動が異なるなら、オーバーフローしてるよお知らせ warn などが出る嬉しいのだけどなぁ。

mac で開発していて問題ない(けど実際はバグ入り)で、本番で挙動が異なってぐぬぬ、とかありそう。あと mac 環境だからなのか、Intel MLK などの使ってる BLAS によって挙動が変わるのかは追いかけていない。

import platform
print(platform.system())
# オーバーフローして1になる
print(np.array([257.0], dtype="float32").astype('uint8'))
# オーバーフローして1になる
print(np.array([257.0, 0, 0, 0, 0, 0, 0], dtype="float32").astype('uint8'))
# オーバーフローして1になるが正しい、と思いきや、環境によっては丸め込まれて255になる
print(np.array([257.0, 0, 0, 0, 0, 0, 0, 0], dtype="float32").astype('uint8'))
Linux
[1]
[1 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
Windows
[1]
[1 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0]

手元の intel mac 環境では丸め込まれる。

Darwin
[1]
[1 0 0 0 0 0 0]
[255   0   0   0   0   0   0   0]