Numpy einsum은 축을 따라 외적을 계산합니다.
Aug 19 2020
호환되는 행렬을 포함하는 두 개의 numpy 배열이 있고 numpy.einsum 사용하여 요소 현명한 외부 곱을 계산하고 싶습니다 . 배열의 모양은 다음과 같습니다.
A1 = (i,j,k)
A2 = (i,k,j)
따라서 배열을 포함하는 i
행렬 모양 (k,j)
과 (j,k)
각각을.
주어진 그래서 A1
매트릭스를 포함하는 것입니다 A,B,C
및 A2
매트릭스를 포함하는 것 D,E,F
, 결과는 다음과 같습니다
A3 = (A(x)D,B(x)E,C(x)F)
함께 (x)
외적 연산자 인.
이것은 이 답변을 기반으로 A3
다음과 같은 모양 의 배열 을 이해하는 데 도움 이됩니다 .
A3 = (i,j*k,j*k)
지금까지 시도했습니다.
np.einsum("ijk, ilm -> ijklm", A1, A2)
그러나 결과 모양이 올바르게 맞지 않습니다.
온 전성 검사로 이것을 테스트하고 있습니다.
A = np.asarray(([1,2],[3,4]))
B = np.asarray(([5,6],[7,8]))
AB_outer = np.outer(A,B)
A_vec = np.asarray((A,A))
B_vec = np.asarray((B,B))
# this line is not correct
AB_vec = np.einsum("ijk, ilm -> ijklm", A_vec,B_vec)
np.testing.assert_array_equal(AB_outer, AB_vec[0])
내 einsum 표기가 올바르지 않기 때문에 현재 어설 션 오류가 발생합니다. 나는 또한 이것을 해결할 수 있고 님프 einsum만큼 빠르거나 똑같이 빠른 제안에 열려 있습니다.
답변
3 Divakar Aug 19 2020 at 17:46
우리는 어둡게하고 우리를 위해 broadcasting일을 하게 할 수 있습니다.
(A1[:,:,None,:,None]*A2[:,None,:,None,:]).swapaxes(2,3)
샘플 실행-
In [46]: A1 = np.random.rand(3,4,4)
...: A2 = np.random.rand(3,4,4)
In [47]: out = (A1[:,:,None,:,None]*A2[:,None,:,None,:]).swapaxes(2,3)
In [48]: np.allclose(np.multiply.outer(A1[0],A2[0]), out[0])
Out[48]: True
In [49]: np.allclose(np.multiply.outer(A1[1],A2[1]), out[1])
Out[49]: True
In [50]: np.allclose(np.multiply.outer(A1[2],A2[2]), out[2])
Out[50]: True
와 동등한 np.einsum것은-
np.einsum('ijk,ilm->ijklm',A1,A2)
1 Valdi_Bo Aug 20 2020 at 01:07
실행중인 결과를 계산할 수 있습니다.
result = np.einsum('ijk,ikl->ijl', A1, A2)
다음 테스트 데이터에서 위 코드를 확인했습니다.
A = np.arange(1, 13).reshape(3, -1)
B = np.arange(2, 14).reshape(3, -1)
C = np.arange(3, 15).reshape(3, -1)
D = np.arange(1, 13).reshape(4, -1)
E = np.arange(2, 14).reshape(4, -1)
F = np.arange(3, 15).reshape(4, -1)
A1 = np.array([A, B, C])
A2 = np.array([D, E, F])
결과는 다음과 같습니다.
array([[[ 70, 80, 90],
[158, 184, 210],
[246, 288, 330]],
[[106, 120, 134],
[210, 240, 270],
[314, 360, 406]],
[[150, 168, 186],
[270, 304, 338],
[390, 440, 490]]])
이제 3 개의 "부분 결과"를 계산합니다.
res_1 = A @ D
res_2 = B @ E
res_3 = C @ F
결과의 연속 섹션과 동일한 지 확인하십시오.