【问题标题】:Numpy overflow with np.divide(). RuntimeWarning: overflow encountered in ushort_scalarsNp.divide() 的 Numpy 溢出。 RuntimeWarning:在 ushort_scalars 中遇到溢出
【发布时间】:2021-07-14 14:13:00
【问题描述】:

我在 2 张图片上运行以下代码:

ndvi = np.divide(img8 - img4, img8+img4)

invalid = (ndvi > 1).any()
if invalid:
    print("Stopping Execution")
    print(ndvi)

img8img4 是 2 个图像,并且具有所有正值。 ndvi 是 (img8-img4)/(img8+img4)

因此,根据定义,ndvi 的所有元素都应介于 -1 和 1 之间。 但我得到了一些值>1

这个上下文中所有变量的dtypes都是'uint16'

当我检查无效值的索引并运行单个代码时:

temp = (img8[88][118]-img4[88][118])/(img8[88][118]+img4[88][118])

我收到以下警告:

<stdin>:1: RuntimeWarning: overflow encountered in ushort_scalars

这些值是: img8[88][118] = 1462 img4[88][118] = 1652

值本身不大会导致溢出,但是当数组变大时会发生溢出。

【问题讨论】:

  • 也许img8 和/或img4 中的值不是您认为的那样。打印出来
  • 另外,请注意,如果img4 中的值大于img8 中的相应值,那么您得到负值
  • @DeepSpace 是的,我明白了。我的意思是它会在 -1 和 1 之间。
  • 请打印所有内容的 dtypes (img8, img4, img4+img8, img8-img4)
  • 可能是由于np.divide 使用嵌套/多维数组的方式。发布minimal reproducible example

标签: python image numpy integer-overflow uint


【解决方案1】:

当从一个小数中减去一个大数并且都是unitXX时,你会得到一个溢出(实际上是一个underflow),结果是负数的模XX,这是一个大数.
这是因为uint 不能代表负数,而是持有很大的正数。

这个模实际上是在负数上加上 maxint (==65535)

在这种情况下,对于您指定的索引,

img8[88][118]-img4[88][118] == 1462 - 1652 == -190 == 65535 - 190 = 65345

除以1462 + 1652 == 3114 得到20.984264611432241490044958253051


解决方案:

Convert the dtypes to float 在除法之前,通常使用浮点数而不是 uint。

浮点数(通常)不存在简单减法的下溢问题,因为它们也可以表示负数。

也可以使用int 而不是uint,但为了您自己的缘故坚持浮动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多