6
def evalPolynomial(coeffs,x):
        return sum([n for n in coeffs] * [x**(m-1)for m in range(len(coeffs),0,-1)]) 

TypeError: タイプ 'リスト' の非 int でシーケンスを乗算できません

エラーの原因がわからない場合 各ステートメントを個別に印刷すると、それぞれリストが表示されますが、それらを乗算しようとすると機能しません。

4

3 に答える 3

12

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 を使用すると整数のサイズが制限されるため、係数が大きすぎてオーバーフローすると誤った結果が得られる可能性があることに注意してください。

于 2013-02-09T20:23:23.267 に答える
2

[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)) ] )
于 2013-02-09T20:24:48.950 に答える
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))))
于 2013-02-09T20:22:31.703 に答える