python - 修复函数的奇异性

标签 python numpy nan singular

假设你有一个像

这样的函数
F = lambda x: sin(x)/x

计算 F(0.0) 会导致被零除警告,并且不会给出 1.0 的预期结果。是否可以编写另一个函数 fix_singularity 将其应用于上述函数时给出所需的结果,以便

fix_singularity(F)(0.0) == 1.0

或者正式地fix_singularity应该通过以下测试:

import numpy as np

def test_fix_singularity():

    F = lambda x: np.sin(x)/x

    x = np.array((0.0, pi))

    np.testing.assert_array_almost_equal( F(x), [nan, 0] )

    np.testing.assert_array_almost_equal( fix_singularity(F)(x), [1, 0] )

一种可能的实现方式是

def fix_singularity(F):
    """ Fix the singularity of function F(x) """

    def L(x):
        f = F(x)
        i = np.isnan(f)
        f[i] = F(x[i] + 1e-16)
        return f

    return L

有更好的方法吗?

编辑: 另外我怎样才能抑制警告:

Warning: invalid value encountered in divide

最佳答案

numpy 有一个 sinc() 函数,它是函数的规范化形式,即

F = lambda x: sin(pi*x) / (pi*x)

它正确处理了 x == 0.0 的情况,

In [16]: x = numpy.linspace(-1,1,11)

In [17]: print x
[-1.  -0.8 -0.6 -0.4 -0.2  0.   0.2  0.4  0.6  0.8  1. ]

要“非规范化”,

In [22]: s = numpy.sinc(x/numpy.pi)

In [23]: print s.round(2)
[ 0.84  0.9   0.94  0.97  0.99  1.    0.99  0.97  0.94  0.9   0.84]

关于python - 修复函数的奇异性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5556919/

相关文章:

Python 正则表达式 re.sub : something

python - 如何在 python 中绘制 3D 数据的核密度估计 (KDE) 和零交叉?

python - Numba CUDA `vectorize` 和 `reduce` 装饰器比预期慢

python - pandas *有效地*按组将有效值复制到其他行

Python Selenium 等待 toast 消息消失

python - 正则表达式删除忽略字符

Javascript 计算 - NaN 消息

matlab - 当您使用 NaN 作为 LIBSVM 的特征值时会发生什么?

python - 我如何告诉 Python sys.argv 在 Unicode 中?

python - 使用 numpy 索引元组