我正在计算numpy.uint8
python 中两个 s
之间的绝对差,如果大于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 整数:
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 回答