在NumPy中使用多项式对象和np.polyval来计算多项式有什么区别?

e7arh2l6  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在NumPy中使用多项式,我想知道使用多项式对象和np.polyval函数在特定值处计算多项式之间的区别。例如,这两个代码片段之间的区别是什么:

equation = np.poly1d(coeff_list)
x = equation(z)
x = (np.polyval(equation, z))

在这里,方程是一个多项式对象,通过使用np.poly1d函数获得,z是我们想要计算多项式的值。两个代码片段将给予我相同的结果,但我对潜在的差异感到好奇。
有谁能解释一下这两种方法的区别吗?在某些情况下,一种方法比另一种更好吗?谢谢!

pftdvrlh

pftdvrlh1#

poly1d是一个类,所以eq是该类的一个示例:

In [8]: eq = np.poly1d([1,2,3])

In [9]: type(eq)
Out[9]: numpy.poly1d

eq有一个__call__方法(它是一个callable),所以可以用作:

In [10]: eq(np.arange(5))
Out[10]: array([ 3,  6, 11, 18, 27])

polyval是一个函数,其代码可以从文档页面中轻松读取:
使用poly1d示例调用它与使用相同的系数列表(加上0)调用它相同:

In [11]: np.polyval(eq, np.arange(5))
Out[11]: array([ 3,  6, 11, 18, 27])

In [12]: np.polyval([0,1,2,3], np.arange(5))
Out[12]: array([ 3,  6, 11, 18, 27])

这是因为如果你迭代eq,你会得到它的系数:

In [13]: list(eq)
Out[13]: [1, 2, 3]

我无法立即找到poly1d的代码;但我怀疑它是相当直接的python。它甚至可能以与polyval相同的方式计算多项式。直接使用eq(x)稍微快一点,但这可能更多地是函数调用级别的结果,而不是真实的的计算差异。
关于“numpy.polynomial是首选”的注解适用于polyvalpoly1d。如果你想用多项式或更一般的类型做一些花哨的事情,它可能是首选,但对于系数列表的简单计算,我看不出有多大优势。
下面是polyval的代码:

def polyval(p, x):
    p = NX.asarray(p)
    if isinstance(x, poly1d):
        y = 0
    else:
        x = NX.asanyarray(x)
        y = NX.zeros_like(x)
    for pv in p:
        y = y * x + pv
    return y

编辑

poly1dcall方法实际上是对polyval的调用:

def __call__(self, val):
    return polyval(self.coeffs, val)

这些都在np.lib.polynomial.py文件中

相关问题