2017-01-10 1 views
2

numpy에서 N 개의 3x3 행렬 배열이 있습니다. 이것은 (내가 내용을 멀리 추상화있어) 내가 그들을 저장하고있어 방법의 예는 다음과 같습니다다중 행렬 곱셈

vectors = np.ones((N, 3)) 
: 나는 또한 3 벡터의 배열을
N = 10 
matrices = np.ones((N, 3, 3)) 

, 이것은 예를 들어 것

나는 이런 식으로 뭔가를 달성하기 위해, NumPy와를 통해 사람들을 곱하는 방법을 알아낼 수없는 것 다음 result_vector의 모양

result_vectors = [] 
for matrix, vector in zip(matrices, vectors): 
    result_vectors.append(matrix @ vector) 

(N, 3) 인 (배열에 캐스팅시). 그러나 목록 구현은 속도 때문에 문제가되지 않습니다.

다양한 전치를 사용하여 np.dot를 시도했지만 최종 결과가 올바른 모양을 얻지 못했습니다.

답변

1

사용 np.einsum -

np.einsum('ijk,ik->ij',matrices,vectors) 

단계 :

1) 정렬 된 최초의 축을 유지합니다.

2) 입력 배열의 마지막 축을 서로에 대해 합계를 줄입니다.

3) 나머지 축 (matrices의 두 번째 축)을 요소 단위로 곱하십시오.

+0

'matmul'과 같은 모양은 약간의 치수 마사지로 사용할 수 있습니다 :'(matrices @ vectors [:, :, None]). squeeze()' – hpaulj