def evalPolynomial(coeffs,x):
return sum([n for n in coeffs] * [x**(m-1)for m in range(len(coeffs),0,-1)])
TypeError:不能将序列乘以“列表”类型的非整数
不确定是什么导致了错误?当我分别打印每个语句时,它们每个都会给我一个列表,但是当我尝试将它们相乘时它不起作用。
def evalPolynomial(coeffs,x):
return sum([n for n in coeffs] * [x**(m-1)for m in range(len(coeffs),0,-1)])
TypeError:不能将序列乘以“列表”类型的非整数
不确定是什么导致了错误?当我分别打印每个语句时,它们每个都会给我一个列表,但是当我尝试将它们相乘时它不起作用。
Python list
s 只能乘以一个整数,在这种情况下 s 的元素list
会重复:
>>> [1,2,3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
如果您想要矢量运算,请numpy.ndarray
改用:
>>> import numpy as np
>>> ar = np.array([1,2,3])
>>> ar * 3
array([3, 6, 9])
特别是卷积有一个numpy函数(即多项式乘法):
>>> a = np.array([1,2,3]) # 1 + 2x + 3x^2
>>> b = np.array([4,5,6]) # 4 + 5x + 6x^2
>>> np.convolve(a, b) # (1 + 2x + 3x^2) * (4 + 5x + 6x^2)
array([ 4, 13, 28, 27, 18]) # 4 + 13x + 28x^2 + 27x^3 + 18x^4
如果您想评估多项式,则可以使用numpy.polyval
执行此操作的函数。
请记住,使用 numpy 会限制整数的大小,因此如果系数太大以至于溢出,您可能会得到错误的结果。
表达式[n for n in coeffs]
是一个list
, 的整数。
列表确实支持乘以整数,但这意味着“制作一个包含 n 个起始列表副本的列表”;在这个数学环境中,这不是你想要的。
我建议您查看numpy
(或scipy
很大程度上是 的超集numpy
)包来帮助解决这个问题。它具有polyval
准确评估您想要的功能,还提供基于类的表示polynomial
。一般来说,要在 Python 中进行数值计算,您应该查看这些包。
但是,如果您想自己动手,则需要在列表理解中进行数学运算,一种方法是:
return sum( [ n*x**(i-1) for (n,i) in zip( coeffs, xrange(len(coeffs),0,-1)) ] )
您正在尝试将多个两个列表放在一起。这不是 python 中的有效操作。
如果您想将两个列表中的每个相应元素相乘,您可以使用如下内容:
def evalPolynomial(coeffs,x):
return sum(x * y for x, y in zip(coeffs, (x**(m-1)for m in range(len(coeffs),0,-1))))