numpy数组中除以零的一致处理

计算科学 Python 麻木的
2021-12-21 10:53:15

我想用来自平滑凹凸函数的值填充一个 numpy 数组

f(x) = exp ( - 1 / (1 - x^2) )     if |x| < 1,  f(x) =  0 otherwise

目前我有一些有用的东西(比如在我的平台上给了我正确的数字)

x = linspace(-1.1 , 1.1, 300)   #Sample 300 points between [-1.1,1.1]
bump = exp( 1 - 1 / (1 - clip(square(x), 0,1)) ) 

当 x 中一个条目的绝对值至少为 1 时,它的正方形被剪裁为 1,并且我们1/(1-1) = 1/0 = +inf在我的平台上将“”作为“预期”,然后由“ exp(1 - inf) = 0”设置,这正是我想要的行为。

我的问题:

  1. 我怀疑以上不是最佳做法。我的怀疑正确吗?
  2. 有没有更好的方法来处理这个除以零?归根结底,数组x可能不仅仅是一个简单的线性值列表。所以我想要一些可以有效计算f(x)的东西x
2个回答

为什么要生成 DivisionByZero 异常?

我会使用掩码数组:

import numpy as np
x= np.linspace(-1.1,1.1,300)
masked_idx = (np.abs(x)>1)
masked_x = np.ma.array(x,mask=idx)

def f(x):
   return np.exp(-1.0/(1.0-x**2))

masked_f = f(masked_x)

plot(masked_x,masked_f)    # in IPython / pyplot

如果需要,您可以在函数中进行屏蔽(通过使用边界参数)

另一种做法:

_f = lambda x: np.exp(-1.0/(1.0-x*x))
f = lambda x: np.piecewise(x, [np.abs(x) < 1, np.abs(x) >= 1], [_f, 0.0])

x = np.linspace(-1.1,1.1,300)
bump = f(x)

我的观点是,你真正需要的是效率ufunc,可能在 C 中实现。在没有 true 的情况下,ufunc你可以使用任何 numpy 技巧。