Python 为什么numpy在不断提高被零除的情况下会遇到?
我有一个类似于Python 为什么numpy在不断提高被零除的情况下会遇到?,python,numpy,where-clause,Python,Numpy,Where Clause,我有一个类似于w=[0.854,0,0.66,0.245,0,0,0,0]的数组,希望对每个值应用100/sqrt(x)。因为我不能除以0,所以我使用以下技巧: w=np.where(w==0,0100/np.sqrt(w)) 因为我没有除以0,所以我不应该有任何警告。 那么,为什么numpy不断提高运行时警告:在true_divide中遇到被零除?100/np。sqrt(w)仍然使用带零的w,因为函数参数是在执行函数之前计算的。零的平方根是零,所以你最后用一个包含零的数组除以100,这个数组反
w=[0.854,0,0.66,0.245,0,0,0,0]
的数组,希望对每个值应用100/sqrt(x)。因为我不能除以0,所以我使用以下技巧:
w=np.where(w==0,0100/np.sqrt(w))
因为我没有除以0,所以我不应该有任何警告。
那么,为什么numpy不断提高运行时警告:在true_divide中遇到被零除?
100/np。sqrt(w)
仍然使用带零的w
,因为函数参数是在执行函数之前计算的。零的平方根是零,所以你最后用一个包含零的数组除以100,这个数组反过来试图用这个数组的每个元素除以100,在某个点上试图用一个等于零的元素除以100。因为它利用了矢量化,它将执行100/np.sqrt(w)
对于w
的每个元素,将发生0除法,但您不会获取与这些条目相关联的结果。因此,基本上你的技巧仍然是除以0,但不使用除以0的条目。第二个参数是错误的。您必须将其更改为w
。博士
您始终可以使用逻辑索引进行计算:
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])
通过这种方式,您可以确保不会被零除,并且不会出现警告或意外行为。这并不重要,因为
np.sqrt(w)
仍然包含零。这将得到完全相同的结果警告不是真正的问题,是吗?如果你想压制它,你可以先用np.nan
替换所有的零。也许w=np.asarray([0如果w_i==0否则100/np.sqrt(w_i)对于w_i in w])
更符合您的要求。是的,这不是一个真正的问题,我只是想了解:)其中
是一个python函数。将对其参数进行求值,并传入结果数组。谢谢!非常清楚。但是,如果不关闭警告,我的解决方案是什么?@NanBlanc,您可以这样做:result=100/np.sqrt(w);结果[np.isinf(结果)]=0
。你仍然会得到警告,很难,因为你无论如何都不能被零除,我明白了!请参阅我在ForceBru中的评论answer@NanBlanc,谢谢你:D
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])