计算 Python 中 numpy 无符号整数之间差异的更好方法



我正在计算python中两个numpy.uint8之间的绝对差异d = abs(a - b),如果b大于a,则会导致溢出错误。避免这种情况的最佳方法是什么?

正如您的评论所示,它们不是ints;它们是numpy.uint8s。只需将它们转换为ints:

>>> 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

所以,是的,它更快,但除非我们谈论做数亿次,否则它不会有一点关系。

最简单的方法是先手动将数字转换为 Python 整数:

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

Python ints 不能溢出(除非内存已满)。

对我来说,它不会抛出溢出错误,如果b大于a,则只会导致错误值。要保持uint8边界,请使用此函数:

def abs_dev (a, b) :
sub1 = a - b
sub2 = b - a
mask = a < b
sub1[mask] = sub2[mask]
return sub1

最新更新