🤔

[numpy] 計算結果がおかしくなる問題について

2023/12/20に公開

おかしくなる原因

異なる型で四則演算をすると結果がおかしくなる

int32とuint16の足し算

a = 1, b = -1として,その和を計算してみます.
型はそれぞれ a(int32), b(uint16)です.

test.py
a = np.array(1) #int32
b = np.array(-1).astype("uint16") #uint16

print(a + b)

結果 65536 (int32)
おかしな結果ですね。本来は0となるはずです。

足す方(a)をuint16にしてみる

今度は先ほどと型を逆転し、
a(uint16), b(int32)として,その和を計算してみます.

test.py
a = np.array(1).astype("uint16") #uint16 
b = np.array(-1) #int32

print(a + b)

結果 0 (int32)
ちゃんと計算できました.

順番が大事

int32 + uint16はおかしくなりますが,
uint16 + int32だとうまくいきます

型で決められている最大値が小さいものに足すように計算するとうまくいきます.

uint16 (最大値65535),
int32 (最大値2,147,483,647)

どの型がどんな最大値をとる?

型の最大値を知っておく必要がありますが,

大体
uint < int < float
だと覚えておくと便利です。

他の型に関しては以下が参考になります.
https://qiita.com/y-yoshinari/items/76260f6359d5b4418b33#整数型との対応

最後に

型を合わせればこういった問題はおこらないので,型を合わせて計算するのが大事ということがわかりました.

Discussion