我需要一个python函数计算一组输入的多项式,points.The函数将多项式权重的向量和输入点的向量作为输入,其中x
:输入值的向量,w
:多项式权重的向量(排序,因此第j个元素是j
阶单项式的线性系数,即x(j)
)。该函数在每个输入点输出多项式的预测值。
有没有内置的python函数来处理这个问题?
发布于 2019-10-01 20:37:48
发布于 2019-10-01 20:44:29
看起来你是在描述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会溢出)。
发布于 2019-10-01 22:30:57
为了好玩,你可以尝试实现基本的算法,iter是最差的,horner是最好的(我相信Karatsuba是最好的)。以下是前两个:
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级代码。
https://stackoverflow.com/questions/58191895
复制