2012-05-08 11 views
1

私はベクトルで行列を乗ろうとしています。そして、pythonはエラーを投げつけ続けます。私が試しているコードは次のとおりです。Pythonでのベクトル行列の乗算?

def matmult(m, v): 
    rows = len(m) 
    w = [0]*rows 
    irange = range(len(v)) 
    sum = 0 
    for j in range(rows): 
     r = m[j] 
     for i in irange: 
      sum += r[i]*v[i] 
    w[j],sum = sum,0 
return w 

これは私のものではありませんが、怒って削除する前にコード化したものです。エラー:TypeError:+: 'int'と 'list'のサポートされていないオペランドタイプ

私は、Pythonがベクトルをintまたはリストとして見ていて、何もしないと思っていますタイプの違いによる基本的な演算子。これを回避する方法はありますか?残念ながら私はナンシーを使うことはできません。ここで

+0

エラーは 'sum + = r [i] * v [i]'行にありました。 – Ammar

+0

'r [i] * v [i]'はリストで、おそらく 'r [i]'はリストで、 'm [j] [i]'がリストであることを意味します。使用している 'm'の値を表示できますか? – Dougal

+0

**宿題のように臭い** ** – KurzedMetal

答えて

4

がpure-pythonのマトリックス倍とベクトルの乗算の異なる、短いアプローチです:

import operator 
import itertools 

def dot(x, y): 
    assert len(x) == len(y) 
    return sum(itertools.starmap(operator.mul, itertools.izip(x, y))) 

def matmult(m, v): 
    return [dot(row, v) for row in m] 

(これは、Pythonの2のためである - ちょうどzipのpython 3のでitertools.izipを置き換える)

+0

ありがとう、私は実際にそれを整理しました。助けてくれてありがとう。 – Ammar

+2

@Ammarあなたは少なくともこのユーザーに報酬を与え、彼の答えを受け入れるか、この質問を開いたままで自分の答えを投稿することができますか? – KurzedMetal