2014-12-09 4 views
1

행렬 곱셈 (dot을 사용하므로 행렬 곱셈)을 사용하여 곱셈을하고 싶은 여러 개의 배열이 있습니다. 나는 그 (것)들을 모두 질적 인 배열로 집어 넣고 싶지만 어떻게해야 하는지를 알 수 없다.행렬의 행렬로 행렬 행렬 곱셈

예.

a = np.random.randn((10,2,2)) 
b = np.random.randn((10,2)) 

그래서 10 개의 2x2 행렬 (a)과 10 개의 2x1 행렬 (b)이 있습니다. 내가 할 수있는 일은 다음과 같습니다.

c = np.zeros((10,2)) 
for i in range(10): 
    c[i] = np.dot(a[i,:,:],b[i,:]) 

아이디어를 얻을 수 있습니다.

그러나 dot 또는 tensordot 등의 사용법이 있거나 한 줄로 쉽게 처리 할 수있는 것 같습니다. 2 차원 이상의>dottensordot 함수를 이해할 수 없습니다.

답변

3

당신은 np.einsum을 사용할 수

c = np.einsum('ijk,ik->ij', a, b) 

einsum 제품의 합을 수행한다. 행렬 곱셈은 곱의 합이므로 모든 행렬 곱은 einsum을 사용하여 표현할 수 있습니다. Einstein summation notation을 기준으로합니다.

einsum의 첫 번째 인수 인 ijk,ik->ijsubscripts의 문자열입니다. ijki, jk으로 표시된 세 축을 가진 a을 선언합니다.

ik도 마찬가지로 b 축은 ik으로 표시됩니다.

첨자가 반복 될 때, 축은 합산을 위해 함께 고정됩니다. -> 다음에 오는 첨자 부분은 합계 후에 남을 축을 표시합니다.

k가 왼쪽 (->)에 나타나지만 오른쪽에서 사라 지므로 k 이상의 합계가 있습니다. 이는 합계가 계산되어야 함을 의미합니다.

c_ij = sum over k (a_ijk * b_ik) 

을 계산해야합니다. 이 합계는 각각 ij에 대해 계산할 수 있으므로 결과는 ij이라는 첨자가있는 배열입니다.

+0

좋습니다. 그거야. 이 표기법을 사용하지 않는 사람들에게 첫 번째 논의가 의미하는 바에 대해 몇 문장을 쓰는 것이 좋습니까? – JoshG79