Каков питонный способ возврата суммы выражений из функции? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть функция 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 голосов
/ 04 февраля 2019

Вы можете использовать выражение генератора и избегать создания промежуточного списка:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...