ndarray, shape (m, n, n)의 W와 dimension (m, n)의 벡터 C가 있다고 가정합니다. 나는 어떻게 루프와 모든없이 벡터화 방법으로이 작업을 수행 할 다음과 같은 방법Numpy 3darray 행렬 곱셈 함수
result = np.empty(m,n)
for i in range(m):
result[i] = W[i] @ C[i]
에서이 두 가지를 곱해야합니까?
ndarray, shape (m, n, n)의 W와 dimension (m, n)의 벡터 C가 있다고 가정합니다. 나는 어떻게 루프와 모든없이 벡터화 방법으로이 작업을 수행 할 다음과 같은 방법Numpy 3darray 행렬 곱셈 함수
result = np.empty(m,n)
for i in range(m):
result[i] = W[i] @ C[i]
에서이 두 가지를 곱해야합니까?
np.tensordot 사용하는 것입니다 끝났다 과 같이, 매우 효율적인 접근 방식 np.einsum
을 사용하는 것이 좋습니다 -
np.einsum('ijk,ik->ij',W,C
)
np.tensordot
또는 np.dot
에는 축 정렬을 유지하는 기능이 없으므로 np.einsum
이 향상됩니다.
np.dot
은 (는) 친구 여야합니다. http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.dot.html
이 나는 행렬 곱셈로에서 마지막 축을 잃어버린 동안, 당신은 정렬 된 두 W
및 C
에서 첫 번째 축을 유지할 필요가 있기 때문에
ans=np.tensordot(W,C,axes=[2,1])[np.arange(m),:,np.arange(m)]
assert np.all(result==ans)