numpy:在true_divide中遇到无效值

Luc*_*uca 10 python arrays numpy

我有两个numpy数组,我试图将一个与另一个分开,同时,我想确保除数为0的条目应该只用0替换.

所以,我做了类似的事情:

log_norm_images = np.where(b_0 > 0, np.divide(diff_images, b_0), 0)
Run Code Online (Sandbox Code Playgroud)

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

RuntimeWarning: invalid value encountered in true_divide
Run Code Online (Sandbox Code Playgroud)

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

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

xx = np.isfinite(b_0)
print (xx[xx == False])
Run Code Online (Sandbox Code Playgroud)

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

两个阵列的形状是(96,96,55,64)和(96,96,55,1)

dra*_*ock 11

运行此命令时收到运行时警告的原因:

log_norm_images = np.where(b_0 > 0, np.divide(diff_images, b_0), 0)
Run Code Online (Sandbox Code Playgroud)

这就是内心的表达

np.divide(diff_images, b_0)
Run Code Online (Sandbox Code Playgroud)

diff_images首先求值,并对and的所有元素运行b_0(即使您最终忽略了涉及除零的元素)。换句话说,警告发生在忽略这些元素的代码之前。这就是为什么它是警告而不是错误:存在像这样的合法情况,其中除以零不是问题,因为它是在稍后的操作中处理的。


rch*_*ang 9

你可能有一个NAN,INFNINF漂浮的地方.试试这个:

np.isfinite(diff_images).all()
np.isfinite(b_0).all()
Run Code Online (Sandbox Code Playgroud)

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

  • 在确认输出确实应该是这样之后,我决定忽略它.因此,使用"with np.errstate(invalid ='ignore',divide ='ignore'):" (4认同)
  • 谢谢。他们都返回 true :/ (2认同)
  • 似乎您可以放心地忽略该警告。我尝试使用两个随机数组(并且其中一个数组中的任意元素设置为 0)来执行此操作 - 第一次运行 `np.where` 时我收到运行时警告,但是如果我第二次重复完全相同的表达式我没有收到警告。 (2认同)