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

时间:2019-02-04 11:11:02

标签: python arrays python-3.x function numpy

我有一个函数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

执行此操作的pythonic方法是什么?

我的操作方式:

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)

如何更好地做到这一点?

1 个答案:

答案 0 :(得分: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,更好的主意是对您的逻辑进行矢量化处理

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将应用于每个值。

如@Oleg的评论中所述,您可能希望np.arange(1, len(A_i)+1)确保枚举始于1