How to return 0 with divide by zero
In numpy v1.7+, you can take advantage of the "where" option for ufuncs. You can do things in one line and you don't have to deal with the errstate context manager.
>>> a = np.array([-1, 0, 1, 2, 3], dtype=float)>>> b = np.array([ 0, 0, 0, 2, 2], dtype=float)# If you don't pass `out` the indices where (b == 0) will be uninitialized!>>> c = np.divide(a, b, out=np.zeros_like(a), where=b!=0)>>> print(c)[ 0. 0. 0. 1. 1.5]
In this case, it does the divide calculation anywhere 'where' b does not equal zero. When b does equal zero, then it remains unchanged from whatever value you originally gave it in the 'out' argument.
Building on @Franck Dernoncourt's answer, fixing -1 / 0 and my bug on scalars:
def div0( a, b, fill=np.nan ): """ a / b, divide by 0 -> `fill` div0( [-1, 0, 1], 0, fill=np.nan) -> [nan nan nan] div0( 1, 0, fill=np.inf ) -> inf """ with np.errstate(divide='ignore', invalid='ignore'): c = np.true_divide( a, b ) if np.isscalar( c ): return c if np.isfinite( c ) \ else fill else: c[ ~ np.isfinite( c )] = fill return c
Building on the other answers, and improving on:
0/0
handling by addinginvalid='ignore'
tonumpy.errstate()
- introducing
numpy.nan_to_num()
to convertnp.nan
to0
.
Code:
import numpy as npa = np.array([0,0,1,1,2], dtype='float')b = np.array([0,1,0,1,3], dtype='float')with np.errstate(divide='ignore', invalid='ignore'): c = np.true_divide(a,b) c[c == np.inf] = 0 c = np.nan_to_num(c)print('c: {0}'.format(c))
Output:
c: [ 0. 0. 0. 1. 0.66666667]