Python 在numpy(sub)数组中被零除

Python 在numpy(sub)数组中被零除,python,arrays,numpy,divide-by-zero,Python,Arrays,Numpy,Divide By Zero,我有三个数组,它们通过一个数学函数进行处理,得到最终的结果数组。有些数组包含NaN,有些数组包含0。然而,逻辑上被零除会发出警告,使用NaN计算会给出NaN。所以我想对数组中涉及零的某些部分执行某些操作: r=numpy.array([3,3,3]) k=numpy.array([numpy.nan,0,numpy.nan]) n=numpy.array([numpy.nan,0,0]) 1.0*n*numpy.exp(r*(1-(n/k))) e、 在k==0的情况下,我希望得到结果0。在所

我有三个数组,它们通过一个数学函数进行处理,得到最终的结果数组。有些数组包含NaN,有些数组包含0。然而,逻辑上被零除会发出警告,使用NaN计算会给出NaN。所以我想对数组中涉及零的某些部分执行某些操作:

r=numpy.array([3,3,3])
k=numpy.array([numpy.nan,0,numpy.nan])
n=numpy.array([numpy.nan,0,0])
1.0*n*numpy.exp(r*(1-(n/k)))

e、 在k==0的情况下,我希望得到结果0。在所有其他情况下,我需要计算上述函数。那么,如何对数组的某些部分进行此类计算(通过索引)以获得最终的单个结果数组呢?

是否遵循您的需要

>>> rv = 1.0*n*numpy.exp(r*(1-(n/k)))
>>> rv[k==0] = 0
>>> rv
array([ nan,   0.,  nan])

因此,您可能认为此问题的解决方案是使用
numpy.where
,但如下所示:

numpy.where(k==0, 0, 1.0*n*numpy.exp(r*(1-(n/k))))
仍然给出了一个警告,因为表达式实际上是针对k为零的情况进行计算的,即使没有使用这些结果

如果这确实让您感到困扰,您可以使用
numexpr
来表示这个表达式,它实际上会在where语句上分支,而不会计算
k==0
的大小写:

import numexpr
numexpr.evaluate('where(k==0, 0, 1.0*n*exp(r*(1-(n/k))))')
另一种方法是,根据您要求的索引,在易读性上有一点损失

result = numpy.zeros_like(k)
good = k != 0
result[good] = 1.0*n[good]*numpy.exp(r[good]*(1-(n[good]/k[good])))
这可以通过定义一个
高斯函数来略过:

def gaussian(r, k, n):
    return 1.0*n*numpy.exp(r*(1-(n/k)))

result = numpy.zeros_like(k)
good = k != 0
result[good] = gaussian(r[good], k[good], n[good])

基本上是的,但是这种先处理后“清洗”的方法仍然会引起警告。我也希望避免警告,例如,排除之前已经存在的k==0的情况,请使用编辑按钮将其添加为对原始答案的编辑。而不是使用
np。在
计算数字索引数组时,使用布尔索引通常更快,即执行
indxZeros=k==0;indxNonZeros=~idxZeros
也可以工作,可能更快。多亏了tobias_k,我对回答这里的问题还是相当陌生的。。我通常只是浏览已经被问过的问题,寻找问题的答案。。谢谢你的建议,下次我会记住的
def gaussian(r, k, n):
    return 1.0*n*numpy.exp(r*(1-(n/k)))

result = numpy.zeros_like(k)
good = k != 0
result[good] = gaussian(r[good], k[good], n[good])