【问题标题】:Better way to calculate difference between numpy unsigned ints in Python在 Python 中计算 numpy 无符号整数之间差异的更好方法
【发布时间】:2012-09-18 16:38:47
【问题描述】:

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

【问题讨论】:

  • 呃...不,它没有。 Python 在必要时自动将整数提升为长整数。此外,Python 中没有无符号整数类型。请发布代码来演示您实际遇到的问题,并进行追溯。
  • 我从外部库 (pygtk) 获得 a 和 b,它们的类型是 numpy.uint8。错误是 RuntimeWarning:ubyte_scalars 中遇到溢出。因此,不可能给出一个简短的工作示例。

标签: python numpy uint


【解决方案1】:

正如您的评论所示,他们不是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

所以是的,它更快,但除非我们说要执行数亿次,否则这一点都不重要。

【讨论】:

  • 这比 Ionut 建议的测试快吗?因为我需要经常这样做。
  • @blues,如果你有一个 numpy 数组(看起来很像鸭子类型的列表),你可能会更快地获得 much,但如果它只是一个values numpy 无法帮助您提高速度...
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    对我来说,它不会引发溢出错误,如果b 大于a,只会导致错误值。要留在uint8 边界内,请使用此函数:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      相关资源
      最近更新 更多