首页 > 解决方案 > 如何使用一些固定参数对 numpy 中的函数进行矢量化?

问题描述

我已经编写了一个用 Bernstein 多项式逼近函数的代码(https://en.wikipedia.org/wiki/Bernstein_polynomial

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

我有一个函数,它将多项式逼近 f 为 bernstein(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 es 固定,并且 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$')

有用。但我想一定有一些更优雅,或者更 Pythonic 的方式来做到这一点。有什么建议么?非常感谢

标签: numpyscipy

解决方案


由于 SciPy 统计函数是矢量化的,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()

推荐阅读