Numpy division by 0 workaround Numpy division by 0 workaround numpy numpy

Numpy division by 0 workaround


A simple trick you can use:

x / (y + (y==0))

In action:

x = np.array([1, 5, 3, 7])y = np.array([0, 2, 0, 4])print(x / (y + (y==0)))# [1.   2.5  3.   1.75]

Timings:

def chrisz(x, y):  return x/(y+(y==0))def coldspeed1(x, y):  m = y != 0  x[m] /= y[m]  return xdef coldspeed2(x, y):  m = ~(y == 0)  x[m] /= y[m]  return xdef coldspeed3(x, y):  m = np.flatnonzero(y)  x[m] /= y[m]  return x

Results:

In [33]: x = np.random.randint(10, size=10000).astype(float)In [34]: y = np.random.randint(3, size=10000).astype(float)In [35]: %timeit chrisz(x, y)29.4 µs ± 601 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)In [36]: %timeit coldspeed1(x, y)173 µs ± 2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)In [37]: %timeit coldspeed2(x, y)184 µs ± 1.36 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)In [38]: %timeit coldspeed3(x, y)179 µs ± 2.68 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)


The easiest/fastest way to do this would be to just divide the values corresponding to a non-zero y-val.

x = [1, 2, 3]y = [0, 1, 0]x, y = [np.array(arr, dtype=float) for arr in (x, y)]m = y != 0  # ~(y == 0) # np.flatnonzero(y)x[m] /= y[m]

print(x)array([1., 2., 3.])