numpy:true_divide 中遇到无效值
numpy: Invalid value encountered in true_divide
我有两个 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])
然而,这两个 return 空数组意味着数组中的所有值都是有限的。因此,我不确定无效值的来源。我假设在 np.where 函数中检查 b_0 > 0 负责除以 0.
两个数组的形状分别是(96, 96, 55, 64)和(96, 96, 55, 1)
您可能有一个 NAN
、INF
或 NINF
漂浮在某处。试试这个:
np.isfinite(diff_images).all()
np.isfinite(b_0).all()
如果其中之一或两者 returns False
,则可能是运行时错误的原因。
另一个有用的 Numpy 命令是 nan_to_num(diff_images)
默认情况下,它替换为 Numpy 数组; NaN 到零,-INF 到 -(大数)和 +INF 到 +(大数)
您可以更改默认值,请参阅 https://numpy.org/doc/stable/reference/generated/numpy.nan_to_num.html
您在 运行 执行此操作时收到 运行 时间警告的原因:
log_norm_images = np.where(b_0 > 0, np.divide(diff_images, b_0), 0)
是内层表达式
np.divide(diff_images, b_0)
首先被求值,并且 运行 在 diff_images
和 b_0
的所有元素上(即使你最终忽略了涉及被零除的元素)。换句话说,警告发生在 在 忽略这些元素的代码之前。这就是为什么它是警告而不是错误的原因:在像这样的合理情况下,被零除不是问题,因为它会在以后的操作中处理。
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 None 4.0 5.0]
我有两个 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])
然而,这两个 return 空数组意味着数组中的所有值都是有限的。因此,我不确定无效值的来源。我假设在 np.where 函数中检查 b_0 > 0 负责除以 0.
两个数组的形状分别是(96, 96, 55, 64)和(96, 96, 55, 1)
您可能有一个 NAN
、INF
或 NINF
漂浮在某处。试试这个:
np.isfinite(diff_images).all()
np.isfinite(b_0).all()
如果其中之一或两者 returns False
,则可能是运行时错误的原因。
另一个有用的 Numpy 命令是 nan_to_num(diff_images) 默认情况下,它替换为 Numpy 数组; NaN 到零,-INF 到 -(大数)和 +INF 到 +(大数)
您可以更改默认值,请参阅 https://numpy.org/doc/stable/reference/generated/numpy.nan_to_num.html
您在 运行 执行此操作时收到 运行 时间警告的原因:
log_norm_images = np.where(b_0 > 0, np.divide(diff_images, b_0), 0)
是内层表达式
np.divide(diff_images, b_0)
首先被求值,并且 运行 在 diff_images
和 b_0
的所有元素上(即使你最终忽略了涉及被零除的元素)。换句话说,警告发生在 在 忽略这些元素的代码之前。这就是为什么它是警告而不是错误的原因:在像这样的合理情况下,被零除不是问题,因为它会在以后的操作中处理。
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 None 4.0 5.0]