最佳实施方式纽比·辛(x) /x其中x可能包含0

2024-04-26 09:21:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在要做的是:

import numpy as np

eps = np.finfo(float).eps

def sindiv(x):
    x = np.abs(x)
    return np.maximum(eps, np.sin(x)) / np.maximum(eps, x)

但是还有很多额外的数组操作。有更好的方法吗?在


Tags: 方法importnumpyreturndefasnpabs
3条回答

您可以使用^{},它计算sin(pix)/(pix):

In [20]: x = 2.4

In [21]: np.sin(x)/x
Out[21]: 0.28144299189631289

In [22]: x_over_pi = x / np.pi

In [23]: np.sinc(x_over_pi)
Out[23]: 0.28144299189631289

In [24]: np.sinc(0)
Out[24]: 1.0

在numpy数组表示法中(因此您得到一个np数组):

def sindiv(x):
    return np.where(np.abs(x) < 0.01, 1.0 - x*x/6.0, np.sin(x)/x)

在这里,我把“epsilon”做了相当大的测试,并用泰勒级数的前两项来近似。实际上,我将0.01改为eps(机器epsilon)的某个小倍数。在

^{pr2}$

输出numpy.ndarray,并且值在原点附近是连续的(如果重要的话,可以微分)。在

如果你不想要双重求值(也就是说,两个分支都是在上面计算的),那么我认为你必须使用一个循环,因为我不认为存在任何“lazy where”选项。在

def sindiv(x):
    sox = np.zeros(x.size)
    for i in xrange(x.size):
        xv = x[i]
        if np.abs(xv) < 0.001: # For testing, use a small multiple of machine epsilon
            sox[i] = 1.0 - xv * xv / 6.0
        else:
            sox[i] = np.sin(xv) / xv
    return sox

为了使这真的是python,最好检查x的类型,如果不是数组,则只执行非数组版本。在

允许div为零,然后替换NaNs怎么样?在

import numpy as np

def sindiv(x):
    a = np.sin(x)/x
    a = np.nan_to_num(a)
    return a

如果不需要警告,请通过seterr来取消警告

当然,可以不使用a

^{pr2}$

相关问题 更多 >