numpy有效地计算多项式

麦克拉菲

我正在尝试使用numpy评估多项式(3度)。我发现通过更简单的python代码执行此操作将更加高效。

import numpy as np
import timeit

m = [3,7,1,2]

f = lambda m,x: m[0]*x**3 + m[1]*x**2 + m[2]*x + m[3]
np_poly = np.poly1d(m)
np_polyval = lambda m,x: np.polyval(m,x)
np_pow = lambda m,x: np.power(x,[3,2,1,0]).dot(m)

print 'result={}, timeit={}'.format(f(m,12),timeit.Timer('f(m,12)', 'from __main__   import f,m').timeit(10000))
result=6206, timeit=0.0036780834198

print 'result={}, timeit={}'.format(np_poly(12),timeit.Timer('np_poly(12)', 'from __main__ import np_poly').timeit(10000))
result=6206, timeit=0.180546045303

print 'result={}, timeit={}'.format(np_polyval(m,12),timeit.Timer('np_polyval(m,12)', 'from __main__ import np_polyval,m').timeit(10000))
result=6206, timeit=0.227771043777

print 'result={}, timeit={}'.format(np_pow(m,12),timeit.Timer('np_pow(m,12)', 'from __main__ import np_pow,m').timeit(10000))
result=6206, timeit=0.168987989426

我错过了什么?

numpy中还有另一种方法来评估多项式吗?

shx2

好吧,看一下polyval(当评估一个poly1d时最终会调用的函数)的实现,看来实现者决定包含一个显式循环很奇怪……从numpy 1.6.2的源头开始:

def polyval(p, x):
    p = NX.asarray(p)
    if isinstance(x, poly1d):
        y = 0
    else:
        x = NX.asarray(x)
        y = NX.zeros_like(x)
    for i in range(len(p)):
        y = x * y + p[i]
    return y

一方面,避免电源操作在速度方面应该是有利的,另一方面,python级别的循环几乎把事情搞砸了。

这是另一种numpy-ish实现:

POW = np.arange(100)[::-1]
def g(m, x):
    return np.dot(m, x ** POW[m.size : ])

为了提高速度,我避免在每次调用时重新创建电源阵列。同样,为公平起见,在对numpy进行基准测试时,您应该从numpy数组而不是列表开始,以避免在每次调用时将列表转换为numpy的麻烦。

因此,添加时m = np.array(m),我的g运行速度仅比您的慢50%f

尽管在您发布的示例中速度较慢,但​​要对标量上的低次多项式求值x,您确实不能比显式实现(例如f快得多(当然可以,但是可以,但是如果不采取措施,可能不会做得太多)编写较低级别的代码)。但是,对于更高的度数(必须将您的显式表达式替换为某种循环),g随着度数的增加,numpy方法(例如)会证明快得多,并且对于矢量化求值(即何时x是向量)也将得到证明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从其根有效地计算多项式系数

来自分类Dev

从其根有效地计算多项式系数

来自分类Dev

计算多项式的最有效方法

来自分类Dev

有效地评估具有80,000个项的80个变量的多项式

来自分类Dev

如何更有效地计算二项式之和?

来自分类Dev

计算 numpy chebychev 多项式的导数

来自分类Dev

使用Python和Numpy有效地计算阶乘

来自分类Dev

有效地计算NumPy中唯一子数组的出现次数?

来自分类Dev

使用Numpy有效地计算欧几里得距离矩阵

来自分类Dev

如何在numpy中有效地计算高斯核矩阵?

来自分类Dev

使用Numpy有效地计算欧几里得距离矩阵

来自分类Dev

如何有效地计算对数回报

来自分类Dev

有效地计算(a-K)/(a + K)

来自分类Dev

有效地计算双积分

来自分类Dev

有效地计算体素数据的梯度

来自分类Dev

如何有效地计算数据

来自分类Dev

如何有效地计算跑步中位数

来自分类Dev

有效地计算邻接矩阵

来自分类Dev

熊猫-有效地计算组合算术

来自分类Dev

如何有效地使用OWLAPI计算脱节?

来自分类Dev

如何有效地计算怪异数字

来自分类Dev

如何有效地计算顶部排列

来自分类Dev

如何更有效地计算滚动比

来自分类Dev

SQL:有效地计算花费的时间

来自分类Dev

有效地计算总和矩阵

来自分类Dev

numpy:有效地与索引数组求和

来自分类常见问题

有效地对numpy数组进行降序排序?

来自分类Dev

numpy:有效地与索引数组求和

来自分类Dev

有效地复制numpy数组