2013-05-02 5 views
6

それぞれ形状mとmの入力行列XとYを考慮する。出力として、(mn、mn)の形状行列を与えて、2つの行列の対応する要素を乗算する必要があります。 これらの2つの行列XとYは、遷移行列を表します。次の例は、必要な出力を示すために使用できます。ここで、Xは3×3行列であり、Yは2×2行列である。遷移行列(m * m)*(n * n)の要素wise積を効率的に計算して(mn * mn)行列を与える

def transition_multiply(X,Y): 
    num_rows_X=len(X) 
    num_rows_Y=len(Y) 
    out=[] 
    count=0 
    for i in range(num_rows_X):  
     for j in range(num_rows_Y):   
      out.append([])   
      for x in X[i]: 
       for y in Y[j]:     
        out[count].append(x*y)    
      count+=1 
    return out 

X=[[1,2,3],[2,3,4],[3,4,5]] 
Y=[[2,4],[1,2]] 
import numpy 
print transition_multiply(numpy.array(X),numpy.array(Y)) 

私は必要な出力を得ることが、非ベクトル化バージョンは本当に遅くなることを実現:

Matrix X 
-------------- 
    x1 x2 x3  
x1| a b c 
x2| d e f 
x3| g h i 

Matrix Y 
-------------- 
    y1 y2 
y1| j k 
y2| l m 

Matrix Z (Output) 
---------------------------------------- 
     x1y1 x1y2 x2y1 x2y2 x3y1 x3y2 
x1y1| aj ak bj bk cj ck 
x1y2| al am bl bm cl cm 
x2y1| dj dk ej ek fj fk 

. 
. 

には、以下の私がこの仕事のために書かれている非ベクトル化機能です。 Numpyを使用して、この計算をベクトル化する最良の方法は何でしょうか。

なぜこの計算が必要なのか興味がある人に。 Factor Hidden Markov Modelの遷移行列を構成遷移行列から作成する際に必要となる。

答えて

8

これはKronecker productです。numpyのマニュアルのhereを参照してください。

+1

素晴らしい!自分自身をコード化しようとするのに無駄な時間を費やしました!ありがとう –

関連する問題