def evalPolynomial(coeffs,x):
return sum([n for n in coeffs] * [x**(m-1)for m in range(len(coeffs),0,-1)])
TypeError: タイプ 'リスト' の非 int でシーケンスを乗算できません
エラーの原因がわからない場合 各ステートメントを個別に印刷すると、それぞれリストが表示されますが、それらを乗算しようとすると機能しません。
def evalPolynomial(coeffs,x):
return sum([n for n in coeffs] * [x**(m-1)for m in range(len(coeffs),0,-1)])
TypeError: タイプ 'リスト' の非 int でシーケンスを乗算できません
エラーの原因がわからない場合 各ステートメントを個別に印刷すると、それぞれリストが表示されますが、それらを乗算しようとすると機能しません。
Pythonlist
の 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 で数値計算を行うには、これらのパッケージを確認する必要があります。
しかし、自分で作成したい場合は、リスト内包表記の中で計算を行う必要があります。その方法の 1 つは次のとおりです。
return sum( [ n*x**(i-1) for (n,i) in zip( coeffs, xrange(len(coeffs),0,-1)) ] )
2 つのリストを一緒に倍増しようとしています。これは Python では有効な操作ではありません。
2 つのリストの対応する各要素を乗算する場合は、次のようなものを使用できます。
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))))