Question

I have three arrays that are processed with a mathematical function to get a final result array. Some of the arrays contain NaNs and some contain 0. However a division by zero logically raise a Warning, a calculation with NaN gives NaN. So I'd like to do certain operations on certain parts of the arrays where zeros are involved:

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. in cases where k == 0, I'd like to get as a result 0. In all other cases I'd to calculate the function above. So what is the way to do such calculations on parts of the array (via indexing) to get a final single result array?

Was it helpful?

Solution

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

OTHER TIPS

Is following what you need?

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

So, you may think that the solution to this problem is to use numpy.where, but the following:

numpy.where(k==0, 0, 1.0*n*numpy.exp(r*(1-(n/k))))

still gives a warning, as the expression is actually evaluated for the cases where k is zero, even if those results aren't used.

If this really bothers you, you can use numexpr for this expression, which will actually branch on the where statement and not evaluate the k==0 case:

import numexpr
numexpr.evaluate('where(k==0, 0, 1.0*n*exp(r*(1-(n/k))))')

Another way, based on indexing as you asked for, involves a little loss in legibility

result = numpy.zeros_like(k)
good = k != 0
result[good] = 1.0*n[good]*numpy.exp(r[good]*(1-(n[good]/k[good])))

This can be bypassed somewhat by defining a gaussian function:

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])
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top