【问题标题】:numpy: Invalid value encountered in true_dividenumpy:在 true_divide 中遇到无效值
【发布时间】:2015-03-06 17:31:56
【问题描述】:

我有两个 numpy 数组,我试图将一个与另一个相除,同时,我想确保除数为 0 的条目应该被替换为 0。

所以,我会这样做:

log_norm_images = np.where(b_0 > 0, np.divide(diff_images, b_0), 0)

这给了我一个运行时警告:

RuntimeWarning: invalid value encountered in true_divide

现在,我想看看发生了什么,我做了以下事情:

xx = np.isfinite(diff_images)
print (xx[xx == False])

xx = np.isfinite(b_0)
print (xx[xx == False])

但是,这两个都返回空数组,这意味着数组中的所有值都是有限的。所以,我不确定无效值来自哪里。我假设在 np.where 函数中检查 b_0 > 0 会处理除以 0。

两个数组的形状分别是(96, 96, 55, 64)和(96, 96, 55, 1)

【问题讨论】:

  • 为什么xxFalse 和一个字典?
  • 我认为 isfinite 返回一个布尔数组。所以,我正在寻找值不是有限的地方。
  • 试试[x for x in xx if x == False]。你只是想获取密钥False
  • 对于它的价值,您可以使用 ~ 运算符“反转”布尔数组。例如。 print your_data[~np.isfinite(your_data)].

标签: python arrays numpy


【解决方案1】:

您可能有一个NANINFNINF 在某处浮动。试试这个:

np.isfinite(diff_images).all()
np.isfinite(b_0).all()

如果其中一个或两个返回 False,则可能是运行时错误的原因。

【讨论】:

  • 谢谢。他们都返回 true :/
  • 看来您可以放心地忽略该警告。我尝试使用两个随机数组(以及其中一个数组中的任意元素设置为 0)来执行此操作 - 我第一次运行 np.where 时收到运行时警告,但如果我第二次重复完全相同的表达式,我不会'没有得到警告。
  • 在确认输出确实看起来应该如此之后,我决定忽略它。所以,使用“with np.errstate(invalid='ignore', divide='ignore'):”
  • @Luca 我认为你应该写这个作为答案。
【解决方案2】:

另一个有用的 Numpy 命令是 nan_to_num(diff_images) 默认情况下,它替换为 Numpy 数组; NaN 到零,-INF 到 -(大数字)和 +INF 到 +(大数字)

您可以更改默认值,请参阅https://numpy.org/doc/stable/reference/generated/numpy.nan_to_num.html

【讨论】:

    【解决方案3】:

    运行时收到运行时警告的原因:

    log_norm_images = np.where(b_0 > 0, np.divide(diff_images, b_0), 0)
    

    是内心的表达

    np.divide(diff_images, b_0)
    

    首先被评估,并在diff_imagesb_0 的所有元素上运行(即使您最终忽略了涉及被零除的元素)。换句话说,警告发生在之前忽略这些元素的代码。这就是为什么它是警告而不是错误的原因:在这种情况下,除零不是问题,因为它是在以后的操作中处理的。

    【讨论】:

      【解决方案4】:
      num = np.array([1,2,3,4,5])
      den = np.array([1,1,0,1,1])
      res = np.array([None]*5)
      ix  = (den!=0)
      res[ix] = np.divide( num[ix], den[ix] )
      print(res)
      

      [1.0 2.0 无 4.0 5.0]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-11
        • 2018-02-04
        • 2017-07-14
        • 1970-01-01
        • 2019-06-12
        相关资源
        最近更新 更多