我需要以x下面的方式计算(遗留代码):
x = numpy.where(b == 0, a, 1/b)
Run Code Online (Sandbox Code Playgroud)
我认为它在python-2.x中工作(因为它在python-2.7代码中),但它在python-3.x中不起作用(if b = 0它返回错误).
如何在python-3.x中使其工作?
编辑:错误消息(Python 3.6.3):
ZeroDivisionError: division by zero
Run Code Online (Sandbox Code Playgroud)
use*_*ica 10
numpy.where不是有条件的执行; 这是条件选择.在函数调用之前总是完全评估Python函数参数,因此函数无法有条件地或部分地评估其参数.
你的代码:
x = numpy.where(b == 0, a, 1/b)
Run Code Online (Sandbox Code Playgroud)
告诉Python反转每个元素b然后从中选择元素a或1/b基于元素b == 0.Python甚至没有达到选择元素的程度,因为计算1/b失败了.
你可以通过仅反转非零部分来避免这个问题b.假设a并b具有相同的形状,它可能看起来像这样:
x = numpy.empty_like(b)
mask = (b == 0)
x[mask] = a[mask]
x[~mask] = 1/b[~mask]
Run Code Online (Sandbox Code Playgroud)
处理数组除法中0个元素的一个老技巧是添加一个条件值:
In [63]: 1/(b+(b==0))
Out[63]: array([1. , 1. , 0.5 , 0.33333333])
Run Code Online (Sandbox Code Playgroud)
(我几年前在中使用过apl)。
x = numpy.where(b == 0, a, 1/b)的评估方式与其他Python函数相同。计算每个函数参数,并将值传递给where函数。没有“短路”或其他方法绕过的不良值1/b。
因此,如果1/b返回错误,则需要更改b以使其不执行该操作,请在traps陷阱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
Run Code Online (Sandbox Code Playgroud)
什么是a和b?标量,一些大小的数组?
where如果b(也许a是)数组是最有意义的:
In [59]: b = np.array([0,1,2,3])
Run Code Online (Sandbox Code Playgroud)
光秃秃的部门给了我一个警告和一个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])
Run Code Online (Sandbox Code Playgroud)
我可以用其他东西where代替它inf,例如a 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])
Run Code Online (Sandbox Code Playgroud)
如@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])
Run Code Online (Sandbox Code Playgroud)
使用np.divide(以及其他浮点数)将0除以0时,如何抑制错误消息?