4

numpy.uint8を使用して Python で 2 つの の絶対差を計算しています。が より大きいd = abs(a - b)場合、オーバーフロー エラーが発生します。これを回避する最善の方法は何ですか?ba

4

3 に答える 3

3

あなたのコメントが示すように、それらはints ではありません。彼らはnumpy.uint8s です。intそれらをsに変換するだけです:

>>> a, b = map(numpy.uint8, (50, 60))
>>> a - b
__main__:1: RuntimeWarning: overflow encountered in ubyte_scalars
246
>>> a, b = map(int, (a, b))
>>> a - b
-10

速度が気になるので、ここにいくつかのテストを示します (感謝の気持ちを込めてSvenのフォームを借ります)。

>>> %timeit abs(int(a) - int(b))
1000000 loops, best of 3: 410 ns per loop
>>> %timeit a - b if a > b else b - a
1000000 loops, best of 3: 470 ns per loop

そうです、その方が高速ですが、何億回も実行することについて話しているのでない限り、それは少しも問題になりません.

于 2012-09-27T00:02:17.437 に答える
2

最も簡単な方法は、最初に手動で数値を Python の int に変換することです。

d = abs(int(a) - int(b))

Python int はオーバーフローできません (メモリがいっぱいでない限り)。

于 2012-09-27T00:05:15.090 に答える
0

私にとっては、オーバーフローエラーは発生しませba。境界内にとどまるには、uint8次の関数を使用します。

def abs_dev (a, b) :
    sub1 = a - b
    sub2 = b - a
    mask = a < b
    sub1[mask] = sub2[mask]
    return sub1
于 2015-03-24T16:52:13.957 に答える