numpy.where
is not conditional execution; it is conditional selection. Python function parameters are always completely evaluated before a function call, so there is no way for a function to conditionally or partially evaluate its parameters.
Your code:
x = numpy.where(b == 0, a, 1/b)
tells Python to invert every element of b
and then select elements from a
or 1/b
based on elements of b == 0
. Python never even reaches the point of selecting elements, because computing 1/b
fails.
You can avoid this problem by only inverting the nonzero parts of b
. Assuming a
and b
have the same shape, it could look like this:
x = numpy.empty_like(b)
mask = (b == 0)
x[mask] = a[mask]
x[~mask] = 1/b[~mask]
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…