什么是从函数返回表达式的总和的Python的方式?

问题描述 投票:2回答:1

我有一个函数F,定义如下:

def F(x, A_0, A_1, phi_1, freq):
    return (A_0 + A_1 * np.sin(2 * np.pi * 1 * freq * x + phi_1))

有时候,我想它扩大到这种形式:

def F(x, A_0, A_1, phi_1, A_2, phi_2, freq):
    return (A_0 + A_1 * np.sin(2 * np.pi * 1 * freq * x + phi_1)
                + A_2 * np.sin(2 * np.pi * 2 * freq * x + phi_2))

我希望能够扩展功能任意许多sin条款。在数学上,我想在函数返回:

enter image description here

什么是Python的方式做到这一点?

我做这件事的方法:

def F(x, A_0, As, phis, freq):
    terms=[]
    for i, A_i in enumerate(As):
        terms.append(A_i*np.sin(2*np.pi*i*freq * x +phis[i]))
    return A_0 +  sum(terms)

如何做到这一点更好?

python arrays python-3.x function numpy
1个回答
2
投票

您可以使用一台发电机的表达和避免创建的中介名单:

def F(x, A_0, As, phis, freq):
    terms = (A_i*np.sin(2*np.pi*i*freq * x +phis[i]) for i, A_i in enumerate(As))
    return A_0 +  sum(terms)

随着NumPy的一个更好的想法是vectorise你的逻辑:

def F(x, A_0, As, phis, freq):
    idx = np.arange(len(As))
    terms = As * np.sin(2 * np.pi * idx * freq * x + phis)
    return A_0 + terms.sum()

为了理解如何工作的,请注意np.sin应用于阵列返回其中np.sin被施加到每个值相同形状的阵列。

椐@奥列格的评论,你可能想np.arange(1, len(A_i)+1),以确保您的枚举始于1

© www.soinside.com 2019 - 2024. All rights reserved.