我需要一个python函数在一组输入点处评估多项式。该函数将多项式权重的向量和输入点的向量作为输入,其中x
:输入值的向量,{ {1}:多项式权重的向量(顺序为第j个元素是第w
次单项式的线性系数,即j
)。该函数在每个输入点输出多项式的预测。
有没有内置的python函数?
答案 0 :(得分:2)
答案 1 :(得分:1)
您似乎在描述numpy.polyval()
:
import numpy as np
# 1 * x**2 + 2 * x**1 + 3 * x**0
# computed at points: [0, 1, 2]
y = np.polyval([1, 2, 3], [0, 1, 2])
print(y)
# [ 3 6 11]
请注意,np.poly1d()
可以实现相同的效果,如果您多次从同一个多项式计算值,则效率会更高:
import numpy as np
# 1 * x**2 + 2 * x**1 + 3 * x**0
my_poly_func = np.poly1d([1, 2, 3])
# computed at points: [0, 1, 2]
y = my_poly_func([0, 1, 2])
print(y)
# [ 3 6 11]
如果您只想使用Python内置程序,则可以轻松地自己定义polyval()
版本,例如:
def polyval(p, x):
return [sum(p_i * x_i ** i for i, p_i in enumerate(p[::-1])) for x_i in x]
y = polyval([1, 2, 3], [0, 1, 2])
print(y)
# [3, 6, 11]
或更有效地:
def polyval_horner(p, x):
y = []
for x_i in x:
y_i = 0
for p_i in p:
y_i = x_i * y_i + p_i
y.append(y_i)
return y
y = polyval_horner([1, 2, 3], [0, 1, 2])
print(y)
# [3, 6, 11]
但是我建议您使用NumPy,除非您有充分的理由不这样做(例如,如果您的结果会因NumPy而溢出而不是纯Python)。
答案 2 :(得分:1)
出于娱乐目的,您可以尝试实现基本算法,迭代器最差,角控器更好(我相信唐津是最好的)。这是前两个:
def iterative(coefficients, x): #very inefficient
i = len(coefficients)
result = coefficients[i - 1]
for z in range(i - 1, 0, -1):
temp = x
for y in range(z - 1):
temp = temp * x
result += temp * coefficients[i - z - 1]
return (x, result)
def horner(coefficients, x):
result = 0
for c in coefficients:
result = x * result + c
return (x, result)
我认为numpy在进入C级代码时,在所有情况下都更快。