Python RuntimeWarning:在divide中遇到无效值
我必须使用Euler的方法为“弹簧中的球”模型制作一个程序 我不断地发现这个错误:Python RuntimeWarning:在divide中遇到无效值,python,python-2.7,matplotlib,Python,Python 2.7,Matplotlib,我必须使用Euler的方法为“弹簧中的球”模型制作一个程序 我不断地发现这个错误: a=-g+km*cos(tt)*(rr-L0)*r[i,:]/rr RuntimeWarning: invalid value encountered in divide 我想不出来,代码怎么了?你在除以rr,可能是0.0。检查rr是否为零,并采取合理措施,而不是在分母中使用它 我认为您的代码试图“除以零”或“除以NaN”。如果您意识到这一点,并且不想让它困扰您,那么您可以尝试: import numpy as
a=-g+km*cos(tt)*(rr-L0)*r[i,:]/rr
RuntimeWarning: invalid value encountered in divide
我想不出来,代码怎么了?你在除以
rr
,可能是0.0。检查rr
是否为零,并采取合理措施,而不是在分母中使用它 我认为您的代码试图“除以零”或“除以NaN”。如果您意识到这一点,并且不想让它困扰您,那么您可以尝试:
import numpy as np
np.seterr(divide='ignore', invalid='ignore')
有关更多详细信息,请参阅:
Python索引从0(而不是1)开始,因此赋值“r[1,:]=r0”定义了r的第二个(即索引1)元素,并将第一个(索引0)元素保留为一对零。for循环中i的第一个值是0,因此rr获取r中第一个条目与自身的点积的平方根(即0),然后在下一行中除以rr就会抛出错误。为了防止被零除,可以在发生div0错误时预初始化输出“out”,例如
np。其中
不会剪切它,因为不管条件如何,都会计算完整的行
预初始化示例:
a = np.arange(10).reshape(2,5)
a[1,3] = 0
print(a) #[[0 1 2 3 4], [5 6 7 0 9]]
a[0]/a[1] # errors at 3/0
out = np.ones( (5) ) #preinit
np.divide(a[0],a[1], out=out, where=a[1]!=0) #only divide nonzeros else 1
打印该行代码中每个较小项目中发生的情况。这是调试它的唯一方法。对于
rr
,您有nan
s,这会抛出该错误。rr
的问题源于r[i,:]
,在某些情况下,它等于数组([nan,nan])
。正如@cppleerner提到的,调试(或编写)代码的最佳方法是在实现之前测试每个较小的部分。将与NP.errstate(divide='ignore',invalid='ignore')一起使用可能会很有用:
如果要抑制代码块的警告,为什么要忽略被零除或NaN除?@xsquared,前提是您自己正确处理了该值,并且正在将代码分发给用户(或者厌倦了看到警告)<使用np.errstate(…)可以仅为已处理的情况安全地执行此操作。@reve_etrange,我发现它比通常忽略除以零更可接受。最好在导致错误的行之前设置此值,然后在行之后通过命令np.seterr重置为正常状态'warn'
(divide='warn',invalid='warn')
a = np.arange(10).reshape(2,5)
a[1,3] = 0
print(a) #[[0 1 2 3 4], [5 6 7 0 9]]
a[0]/a[1] # errors at 3/0
out = np.ones( (5) ) #preinit
np.divide(a[0],a[1], out=out, where=a[1]!=0) #only divide nonzeros else 1