在numpy(子)数组中除以零

时间:2014-01-14 09:46:09

标签: 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.g。在k == 0的情况下,我想得到结果0.在所有其他情况下,我将计算上面的函数。那么在数组的某些部分(通过索引)进行这样的计算以获得最终的单个结果数组的方法是什么?

3 个答案:

答案 0 :(得分:3)

import numpy
r=numpy.array([3,3,3])
k=numpy.array([numpy.nan,0,numpy.nan])
n=numpy.array([numpy.nan,0,0])
indxZeros=numpy.where(k==0)
indxNonZeros=numpy.where(k!=0)
d=numpy.empty(k.shape)
d[indxZeros]=0
d[indxNonZeros]=n[indxNonZeros]/k[indxNonZeros]
print d

答案 1 :(得分:2)

遵循你的需要吗?

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

答案 2 :(得分:1)

因此,您可能认为此问题的解决方案是使用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])))

这可以通过定义gaussian函数来稍微绕过:

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])