使用poly1d与polyder求多项式导数时系数顺序异常的一行代码解法
解决numpy poly1d与polynomial.polyder系数顺序不匹配的问题
我懂你碰到的这个坑——numpy里两套多项式工具对系数顺序的定义完全相反,直接组合用肯定出问题:
np.poly1d要求系数按高次项到低次项排列,比如np.poly1d([3,2,1])代表3x² + 2x + 1- 而
numpy.polynomial.polynomial模块里的函数(包括P.polyder),是按低次项到高次项处理系数的,你的c=(1,1,1,1)在这个模块里代表1 + x + x² + x³
直接把P.polyder(c)的结果传给poly1d,顺序自然就乱了。这里有两个简洁的一行代码解决方案:
方案1:反转polyder的结果
把P.polyder输出的低次到高次系数反转,适配poly1d的要求:
print(np.poly1d(P.polyder(c)[::-1]))
解释:P.polyder(c)对1+x+x²+x³求导后得到1+2x+3x²,系数是(1,2,3),[::-1]反转后变成(3,2,1),正好是poly1d需要的高次到低次顺序,输出就是正确的导数多项式 3x² + 2x + 1。
方案2:直接用numpy顶层的polyder(更省心)
其实你完全可以不用polynomial模块,直接用numpy自带的np.polyder处理poly1d对象,彻底绕开顺序问题:
print(np.polyder(np.poly1d(c)))
这里np.poly1d(c)先把(1,1,1,1)解析为x³+x²+x+1,np.polyder直接对这个多项式求导,输出结果就是正确的 3x² + 2x + 1。
内容的提问来源于stack exchange,提问作者Ari Kalmen
相关产品推荐
相关产品推荐

