形状 (m,m) および (n,n) の入力行列 X および Y をそれぞれ考えます。出力として、2 つの行列の対応するエントリを乗算するように (mn,mn) 形状行列を与える必要があります。これら 2 つの行列 X と Y は遷移行列を表します。次の例は、必要な出力を示すために使用できます。ここで、X は 3*3 行列、Y は 2*2 行列です。
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
.
.
以下は、このタスクのために私が書いたベクトル化されていない関数です。
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))
必要な出力は得られますが、ベクトル化されていないバージョンは非常に遅くなることに気付きました。Numpy を使用して、この計算をベクトル化する最良の方法は何でしょうか。
なぜこの計算が必要なのか興味のある方へ。成分遷移行列から階乗隠れマルコフモデルの遷移行列を作成する際に必要です。