在数组除法中处理 0 元素的一个老技巧是添加一个条件值:
In [63]: 1/(b+(b==0))
Out[63]: array([1. , 1. , 0.5 , 0.33333333])
(我几年前在apl使用过这个)。
x = numpy.where(b == 0, a, 1/b) 的评估方式与任何其他 Python 函数相同。评估每个函数参数,并将值传递给where 函数。没有“短路”或其他绕过1/b 错误值的方法。
因此,如果 1/b 返回错误,您需要更改 b 以便它不这样做,在陷阱陷阱 ZeroDivisionError 或跳过 1/b 的上下文中计算它。
In [53]: 1/0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-53-9e1622b385b6> in <module>()
----> 1 1/0
ZeroDivisionError: division by zero
In [54]: 1.0/0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-54-99b9b9983fe8> in <module>()
----> 1 1.0/0
ZeroDivisionError: float division by zero
In [55]: 1/np.array(0)
/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in true_divide
#!/usr/bin/python3
Out[55]: inf
a 和 b 是什么?标量,某种大小的数组?
如果b(也可能是a)是一个数组,where 最有意义:
In [59]: b = np.array([0,1,2,3])
裸除给我一个警告,以及一个inf 元素:
In [60]: 1/b
/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in true_divide
#!/usr/bin/python3
Out[60]: array([ inf, 1. , 0.5 , 0.33333333])
我可以使用where 将inf 替换为其他内容,例如nan:
In [61]: np.where(b==0, np.nan, 1/b)
/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in true_divide
#!/usr/bin/python3
Out[61]: array([ nan, 1. , 0.5 , 0.33333333])
警告可以像@donkopotamus 显示的那样被静音。
seterr 的替代方案是 errstate 在 with 上下文中:
In [64]: with np.errstate(divide='ignore'):
...: x = np.where(b==0, np.nan, 1/b)
...:
In [65]: x
Out[65]: array([ nan, 1. , 0.5 , 0.33333333])
How to suppress the error message when dividing 0 by 0 using np.divide (alongside other floats)?