python 将具有多个输入的函数向量化以形成唯一函数

eufgjt7s  于 12个月前  发布在  Python
关注(0)|答案(2)|浏览(91)

我有一个这样的函数:

def signal_prototype(t, A, f, p):
    return A*np.sin(2*np.pi*f*t+p)

字符串
我想把它矢量化,这样我就可以像下面这样使用函数了。

signal_A = SOME_VECTORIZE_FUNCTION(signal_prototype, t=t, A=1, f=10000, p=0)
signal_B = SOME_VECTORIZE_FUNCTION(signal_prototype, t=t, A=1, f=10000, p=np.pi/4)
signal_C = SOME_VECTORIZE_FUNCTION(signal_prototype, t=t, A=1, f=10000, p=np.pi/2)
signal_D = SOME_VECTORIZE_FUNCTION(signal_prototype, t=t, A=1, f=10000, p=3*np.pi/4)

t = np.linspace(0,1e-3,100000)
X1 = signal_A(t)
X2 = signal_B(t)
X3 = signal_C(t)
X4 = signal_D(t)


谢谢你,谢谢
我试着使用np.vectorize并阅读文档。似乎没有任何方法可以发送静态参数来进行矢量化。
然而,vectorize可能不是最好的工具。
我有一组复杂的微分方程,这些信号是它们的输入,所以我需要f(t,x)形式的函数。
新的信号函数是随着模型中条件的变化而动态创建的。因此,创建每个方程的静态版本并不是一个好的选择。

xnifntxz

xnifntxz1#

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)


如果您想为每个函数创建一个函数,可以按照建议使用lambdafunctools.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或者使它成为可选的,你可以扩展它,虽然我不建议这样做,只是让它来说明这是多么强大,因为它永远不建议返回不同类型的东西(比如imo一个参数数量可变的函数)

不要这样做

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([ 0.00000000e+00,  6.28324773e-04,  1.25664930e-03, ...,
       -1.25664930e-03, -6.28324773e-04, -2.44929360e-15])
>>> wrapper(signal_prototype, t=t, A=1, f=10000, p=0)()
array([ 0.00000000e+00,  6.28324773e-04,  1.25664930e-03, ...,
       -1.25664930e-03, -6.28324773e-04, -2.44929360e-15])

的字符串

ttisahbt

ttisahbt2#

上面的答案确实帮助我弄清楚了我需要做什么。

X1 = partial(signal_prototype, A=1e-3, f=1e3, p=0)
X2 = partial(signal_prototype, A=1e-3, f=1e3, p=np.pi/4)
X3 = partial(signal_prototype, A=1e-3, f=1e3, p=np.pi/2)
X4 = partial(signal_prototype, A=1e-3, f=1e3, p=3*np.pi/4)

字符串
现在我有了可以这样调用的函数。

X1(t)
X2(t)
etc...

相关问题