Numpy在哪里划分为零

0 python numpy

我需要以x下面的方式计算(遗留代码):

x = numpy.where(b == 0, a, 1/b) 
Run Code Online (Sandbox Code Playgroud)

我认为它在(因为它在代码中),但它在不起作用(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然后从中选择元素a1/b基于元素b == 0.Python甚至没有达到选择元素的程度,因为计算1/b失败了.

你可以通过仅反转非零部分来避免这个问题b.假设ab具有相同的形状,它可能看起来像这样:

x = numpy.empty_like(b)
mask = (b == 0)
x[mask] = a[mask]
x[~mask] = 1/b[~mask]
Run Code Online (Sandbox Code Playgroud)


hpa*_*ulj 5

处理数组除法中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)

什么是ab?标量,一些大小的数组?


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所示,该警告可以被静音。

的替代方法seterrerrstatewith上下文中:

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时,如何抑制错误消息?