Как векторизовать функцию в numpy с некоторыми фиксированными параметрами? - PullRequest
1 голос
/ 04 марта 2020

Я написал код для аппроксимации функции полиномами Бернштейна (https://en.wikipedia.org/wiki/Bernstein_polynomial)

при

https://github.com/pdenapo/metodos-numericos/blob/master/python/bernstein.py

У меня есть функция, которая дает полином, аппроксимирующий f как бернштейна (f, n, p) (где f - функция, которую я хочу аппроксимировать, n - степень, а p - точка, где она оценивается.

def bernstein(f, n, p):return np.sum(
    [f(k / n) * st.binom.pmf(k, n, p) for k in np.arange(0, n + 1)])

Теперь я хочу сгенерировать график этой функции, где f и n являются фиксированными, а p выполняется через вектор, сгенерированный np.arrange. Итак, я векторизирую функцию следующим образом:

 bernstein3 = lambda x: bernstein(f, 3, x)
 bernstein3 = np.vectorize(bernstein3)
 y3 = bernstein3(x)
 plt.plot(x, y3, 'green', label='$B_3$')

Это работает. Но я думаю, что должен быть какой-то более элегантный, или, возможно, более pythoni c способ сделать это. Любые предложения? Большое спасибо

1 Ответ

1 голос
/ 04 марта 2020

Поскольку функции SciPy statisti c векторизованы, ваша функция bernstein может быть изменена простым способом, чтобы работать следующим образом:

import numpy as np
import scipy.stats

def bernstein(f, n, p):
    # Vector of k values
    k = np.arange(n + 1)
    # Add a broadcasting dimension to p
    pd = np.expand_dims(p, -1)
    # Compute approximation
    return np.sum(f(k / n) * scipy.stats.binom.pmf(k, n, pd), -1)

Она будет использоваться просто так:

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return np.abs(1 / 2 - x)

x = np.linspace(0, 1, 100)
y = f(x)
plt.plot(x, y, 'blue', label='f(x)')
y_approx = bernstein(f, 10, x)
plt.plot(x, y_approx, 'orange', label='f_approx(x)')
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...