有没有更简洁的方法来定义这个简单的帽子函数?

Is there a more concise way to define this simple hat function?

我正在研究傅立叶级数,想绘制 Python 中的一些结果。使用傅立叶级数进行分析的一种常见函数是帽子函数:

下面的代码显示了我对 hat 函数进行编码的两种不同方式。一个使用 numpy,另一个使用我编写的自定义函数 hat(x,a,L)。参数a表示帽子的宽度,而L是函数从(-L,L)的整体域。

我认为我编写的函数更具可读性,但我怀疑它是否与 numpy piecewise 函数一样快。但是我觉得numpy的函数很丑

有没有更好的方法来写更简洁快速的帽子函数? (可读性加分)

import matplotlib.pyplot as plt
import numpy as np

# defining the hat function parameters, domain
L=-5
a=1
x=np.linspace(-L,L,100)

# using my hat function
y=hat(x,a,L)
plt.plot(x,y,'r')
plt.show()

# numpy hat function - piecewise
y=np.piecewise(x,
               [x<-a,(-a<x)&(x<0),x==0,(0<x)&(x<a),a<x],
               [0,lambda x:1+x/a,1,lambda x:1-x/a,0])
plt.plot(x,y,'r')
plt.show()

# hat function
def hat(x,a,L):
    y=x.copy()
    y[x<-a]=0
    y[(x>-a)&(x<0)]=1+x[(x>-a)&(x<0)]/a
    y[x==0]=1
    y[(x>0)&(x<a)]=1-x[(x>0)&(x<a)]/a
    y[x>a]=0
    return y

这是另一个解决方案

def hat(x,a,L):
    y=x.copy()
    y[(x<-a) | (x>a)]=0
    y[(x>-a)&(x<0)]+=1
    y[x==a]=1
    y[(x>0)&(x<a)]*=-1
    y[(x>0)&(x<a)]+=1
    return y

在你的 hat 函数中,你有 y[x==a]=1 但在 numpy 版本中你有 ,x==0, = ,1,,它们是不一样的。

_______

类似这样的对称性

import matplotlib.pyplot as plt
import numpy as np

# defining the hat function parameters, domain
L=5
a=1
x=np.linspace(0,L,51)
# hat function
def hat(x,a,L):
    y=x.copy()
    y[x==0]=1
    y[(x > 0) & (x < a)] *= -1
    y[(x > 0) & (x < a)] += 1
    y[(x>=a)]=0
    y = np.hstack((y[-1:0:-1], y))
    return y
# using my hat function
y2=hat(x,a,L)

x=np.linspace(-L,L,101)
# numpy hat function - piecewise
y=np.piecewise(x,
               [x<-a,(-a<x)&(x<0),x==0,(0<x)&(x<a),a<x],
               [0,lambda x:1+x,1,lambda x:1-x,0])
plt.plot(x,y,'b')
plt.plot(x,y2,'r')
plt.show()

____

您还可以使用数学计算 y 信号,然后放置一些零

x=np.linspace(-L,L,101)
y3 = np.zeros(x.shape)
y3[(x>-a)&(x<a)] = -np.abs(x[(x>-a)&(x<a)]) + 1

但这真的取决于你的情况