2013-05-17 4 views
2

결과 행렬의 각 위치에 대해 해당 행과 열의 인수를 인수 행렬에 저장하는 대신, 요소 현명한 제품을 저장하고 싶습니다. 이는 3 차원으로 확장되는 벡터가됩니다.numpy 행렬 곱셈의 합계를 새로운 차원의 연결로 바꾸려면 어떻게해야합니까?

하나의 아이디어는 인수 행렬을 벡터 항목이있는 벡터로 변환 한 다음 외부 제품을 가져 오는 것이지만이 방법도 잘 모릅니다.

편집 :

답장을 받기 전에 알아 냈습니다. 내가 뭐하는 거지 것은 떨어져 자신의 외적 촬영 한 각 행과 열 쌍을 복용 한 후 그 내용을 얻을 그들 중 두 목록을 형성한다

def newdot(A, B): 
    A = A.reshape((1,) + A.shape) 
    B = B.reshape((1,) + B.shape) 

    A = A.transpose(2, 1, 0) 
    B = B.transpose(1, 0, 2) 

    return A * B 

하는 병렬로 함께 곱한 행렬입니다 여기 내 솔루션입니다.

답변

2

그것은 조금 복잡한 (그리고 설명하기 어려운)하지만이 기능은 당신이 찾고있는 무엇을 얻어야한다이다 :

def f(m1, m2): 
    return (m2.A.T * m1.A.reshape(m1.shape[0],1,m1.shape[1])) 

m3 = m1 * m2 
m3_el = f(m1, m2) 

m3[i,j] == sum(m3_el[i,j,:]) 
m3 == m3_el.sum(2) 

기본적인 아이디어는 배열에 행렬을 설정하는 것입니다 및 요소 - 부산물을 엘리먼트 곱셈. 배열 중 하나가 중간 크기에서 1 크기로 재구성되고 배열 브로드 캐스팅 규칙은이 배열을 다른 배열의 높이와 일치하도록 확장합니다.

+1

당신은'm1.A [:, None, :]'로 당신을 바꿀 수 있습니다. 그러면 좀 더 컴팩트 해지고 더 읽기 쉬워집니다. – Jaime