【问题标题】:why is numpy where keep raising divide by zero encountered?为什么 numpy 在哪里不断提高除以零?
【发布时间】:2019-08-07 11:48:16
【问题描述】:

我有一个类似w=[0.854,0,0.66,0.245,0,0,0,0] 的数组,并且想对每个值应用 100/sqrt(x)。因为我不能除以 0,所以我正在使用这个技巧:

w=np.where(w==0,0,100/np.sqrt(w))

因为我没有除以 0,所以我不应该有任何警告。 那么为什么 numpy 一直在提高 RuntimeWarning: divide by zero encountered in true_divide 呢?

【问题讨论】:

  • 警告不是问题,是吗?如果你想压制它,你可以先用np.nan替换所有的零。 Another solution is to disable the warning locally or globally.
  • 也许w=np.asarray([0 if w_i==0 else 100/np.sqrt(w_i) for w_i in w]) 更符合您的要求。
  • 是的,这不是真正的问题,我只是想了解 :)
  • where 是一个 python 函数。它的参数被评估并传入结果数组。

标签: python numpy where-clause


【解决方案1】:

由于它利用了矢量化,它将为w 的每个元素执行100/np.sqrt(w),因此会发生除以0,但是您不会获取与这些条目相关联的结果。所以基本上用你的技巧你仍然除以 0 但不使用你除以 0 的条目。

【讨论】:

  • 我明白了!请在 ForceBru 答案中查看我的评论
【解决方案2】:

100/np.sqrt(w) 仍然使用带零的w,因为函数参数在执行函数之前被评估。零的平方根为零,因此您最终将 100 除以一个包含零的数组,该数组又尝试将 100 除以该数组的每个元素,并在某些时候尝试将其除以一个等于零的元素。

【讨论】:

  • 谢谢!很清楚。但是,如果不关闭警告,我的解决方案是什么?
  • @NanBlanc,你可以这样做:result=100/np.sqrt(w);result[np.isinf(result)]=0。你仍然会收到警告,很难,因为无论如何你都不能除以零
【解决方案3】:

你总是可以使用逻辑索引来计算它:

w = [0.854,0,0.66,0.245,0,0,0,0]
w = np.array(w)
w[w!=0] = 100 / np.sqrt(w[w!=0])

这样可以确保不会除以零,也不会出现警告或意外行为。

【讨论】:

  • @NanBlanc,谢谢:D
【解决方案4】:

第二个论点是错误的。您必须将其更改为wnp.where的文档

w=np.where(w==0,w,100/np.sqrt(w))

【讨论】:

  • 这无关紧要,因为np.sqrt(w) 仍然包含零。
  • 它会得到完全相同的结果