numpy.uint8
を使用して Python で
2 つの の絶対差を計算しています。が より大きいd = abs(a - b)
場合、オーバーフロー エラーが発生します。これを回避する最善の方法は何ですか?b
a
質問する
3851 次
3 に答える
3
あなたのコメントが示すように、それらはint
s ではありません。彼らはnumpy.uint8
s です。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
私にとっては、オーバーフローエラーは発生しませb
んa
。境界内にとどまるには、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 に答える