2013-05-02 3 views
6

모양의 입력 행렬 X와 Y를 각각 고려하십시오 . 출력으로 우리는 (mn, mn) 형태 행렬을 주어서 두 행렬의 해당 엔트리를 곱해야합니다. 이 두 행렬 X와 Y는 전이 행렬을 나타냅니다. 다음 예제는 필요한 출력을 보여줍니다. 여기서 X는 3 * 3 행렬이고 Y는 2 * 2 행렬입니다.(mn * mn) 행렬을 제공하기 위해 전이 행렬 (m * m) * (n * n)의 요소 현명한 곱을 효율적으로 계산

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를 사용하여이 계산을 벡터화하는 가장 좋은 방법은 무엇입니까?

왜이 계산이 필요한지 관심이있는 사람들에게. Factory Hidden Markov Model의 전이 행렬을 구성하는 전이 행렬에서 만드는 데 필요합니다.

답변

8

이것은 Kronecker product입니다 (numpy 설명서의 here 참조).

+1

좋아요! 나 자신을 코딩하려고 너무 많은 시간을 낭비했다. 감사 –