英文:
What is the difference between using a polynomial object and np.polyval to evaluate a polynomial in NumPy?
问题
np.poly1d函数用于创建多项式对象,而np.polyval函数用于在特定值处评估多项式。这两种方法都可以得到相同的结果,但是np.poly1d创建了一个多项式对象,可以像函数一样调用,而np.polyval直接在特定值处计算多项式的值。在选择方法时,取决于你的需求和代码的上下文。
英文:
I am working with polynomials in NumPy and I am wondering about the difference between using a polynomial object and the np.polyval function to evaluate a polynomial at a specific value. For example, what is the difference between these two code snippets:
equation = np.poly1d(coeff_list)
x = equation(z)
x = (np.polyval(equation, z))
Here, the equation is a polynomial object obtained by using the np.poly1d function and z is the value at which we want to evaluate the polynomial. Both code snippets will give me the same result, but I am curious about the underlying differences.
Can anyone explain the difference between these two approaches? Is one approach preferred over the other in certain situations? Thanks!
答案1
得分: 1
poly1d
是一个类,所以 eq
是该类的一个实例:
In [8]: eq = np.poly1d([1,2,3])
In [9]: type(eq)
Out[9]: numpy.poly1d
eq
有一个 __call__
方法(它是一个可调用对象),可以这样使用:
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
" 的注释适用于 polyval
和 poly1d
。如果你想对多项式进行高级操作或更一般的类型,可能更倾向于使用它,但对于使用系数列表进行简单评估,我没有看到很大的优势。
这是 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
编辑
poly1d
的 call
方法实际上是对 polyval
的调用:
def __call__(self, val):
return polyval(self.coeffs, val)
所有这些都在 np.lib.polynomial.py
文件中。
英文:
poly1d
is a class, so eq
is an instance of that class:
In [8]: eq = np.poly1d([1,2,3])
In [9]: type(eq)
Out[9]: numpy.poly1d
eq
has a __call__
method (it's a callable
), so can be used as:
In [10]: eq(np.arange(5))
Out[10]: array([ 3, 6, 11, 18, 27])
polyval
is a function, whose code is readily readable from the doc page:
Calling it with a poly1d
instance is the same as calling it with the same list of coefficients (plus a 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])
That's because if you iterate on eq
you get its coefficients:
In [13]: list(eq)
Out[13]: [1, 2, 3]
I can't offhand find the code for poly1d
; but I suspect it's fairly straight forward python. It may even evaluate the polynomial in the same way as polyval
. Direct use of eq(x)
is slightly faster, but that may more the result of levels of function calls than real evaluation differences.
The note about "numpy.polynomial
is preferred" applies to both polyval
and poly1d
. It may be preferred if you want to do fancy stuff with polynomials, or more general types, but for simple evaluation with a list of coefficients, I don't see much advantage.
Here's the code for 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
edit
The call
method of poly1d
is actually a call to polyval
:
def __call__(self, val):
return polyval(self.coeffs, val)
This is all in the np.lib.polynomial.py
file
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论