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]
記事の一覧 >

関連するかもエントリー

HX711で重さを量る
ハカリなど重さを量るには、一般的にロードセルとひずみゲージセンサーを使って実現している。HX711 は安価なひずみゲージを読み取るためのICで、24bit ADCを搭載していて、ICにクロックを送ることでデータを受け取る。ebay では実装済の物が一つ100円以下で買える。ロード...
ハカリなど重さを量るには、一般的にロードセルとひずみゲージセンサーを使って実現している。HX711 は安価なひずみゲージを読み取るためのIC...
2011-06-15
Ruby で Array を継承したクラスをうまくあつかうRuby で Array を継承/Mix-inしたクラスで、自分で定義した便利なメソッドを利用したい時ってありますよね。そんなとき普通にclass MyArray < Array def odd select ...
Ruby で Array を継承したクラスをうまくあつかうRuby で Array を継承/Mix-inしたクラスで、自分で定義した便利なメ...