np.sin()
函数本身就能够处理数组输入,并进行向量化计算:
>>> np.sin(np.array([1,2,3]))
array([0.84147098, 0.90929743, 0.14112001])
你无需对原函数做特殊处理,可以直接这样调用:
def signal_prototype(t, A, f, p):
return A * np.sin(2 * np.pi * f * t + p)
t = np.linspace(0, 1e-3, 100000)
X1 = signal_prototype(t=t, A=1, f=10000, p=0)
X2 = signal_prototype(t=t, A=1, f=10000, p=np.pi/4)
X3 = signal_prototype(t=t, A=1, f=10000, p=np.pi/2)
X4 = signal_prototype(t=t, A=1, f=10000, p=3*np.pi/4)
如果你想针对每个特定参数组合生成独立的函数,可以使用 lambda
表达式或 functools.partial
:
from functools import partial
signal_A = lambda t: signal_prototype(t=t, A=1, f=10000, p=0)
signal_B = lambda t: signal_prototype(t=t, A=1, f=10000, p=np.pi/4)
signal_C = lambda t: signal_prototype(t=t, A=1, f=10000, p=np.pi/2)
signal_D = lambda t: signal_prototype(t=t, A=1, f=10000, p=3*np.pi/4)
X1 = signal_A(t)
X2 = signal_B(t)
X3 = signal_C(t)
X4 = signal_D(t)
或者自定义一个包装器函数来达到类似效果(这和使用 lambda
函数本质上是一样的):
def wrapper(func, **kwargs):
def wrapped(t):
return func(t, **kwargs)
return wrapped
signal_A = wrapper(signal_prototype, A=1, f=10000, p=0)
signal_B = wrapper(signal_prototype, A=1, f=10000, p=np.pi/4)
signal_C = wrapper(signal_prototype, A=1, f=10000, p=np.pi/2)
signal_D = wrapper(signal_prototype, A=1, f=10000, p=3*np.pi/4)
尽管如此,如果你希望给 t
赋予一个默认值或使其变为可选参数,理论上可以扩展包装器函数实现,但不建议这样做,因为返回具有不同参数类型的函数是不明智的:
不推荐这样做
def wrapper(func, t=None, **kwargs):
if t is not None:
def wrapped(t=t):
return func(t, **kwargs)
else:
def wrapped(t):
return func(t, **kwargs)
return wrapped
下面展示了这种情况下函数调用的结果:
>>> wrapper(signal_prototype, A=1, f=10000, p=0)(t)
array([...]) # 此处显示结果被省略,实际输出为根据t计算出的信号数组
>>> wrapper(signal_prototype, t=t, A=1, f=10000, p=0)()
array([...]) # 同样,此处显示结果被省略,实际输出为根据t计算出的信号数组