2016-06-08 4 views
2

누군가 numpy.einsum() 함수에서 방송 (줄임표)이 어떻게 작동하는지 설명해 주시겠습니까?Numpy einsum 방송

사용할 수있는 방법과시기를 보여주는 몇 가지 예제를 크게 높이 평가할 수 있습니다.

다음 공식 문서 페이지를 확인했지만 예제가 2 개뿐이므로이를 해석하고 사용하는 방법을 이해할 수 없습니다.

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.einsum.html

+0

는 유닛 테스트 파일에 더 많은 예제가 있습니다, https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_einsum.py – hpaulj

답변

5

타원은 대략 "명시 적으로 언급되지 않은 나머지 모든 축"에 대한 서 속기이다. 예를 들어, 형태의 배열 (2,3,4,5,6,6) 있다고 가정 :

import numpy as np 
arr = np.random.random((2,3,4,5,6,6)) 

을 당신은 마지막 두 개의 축을 따라 추적을 할 :

result = np.einsum('ijklmm->ijklm', arr) 
result.shape 
# (2, 3, 4, 5, 6) 

동등한 방법 즉

result2 = np.einsum('...mm->...m', arr) 
assert np.allclose(result, result2) 

타원 (이 경우) 약식 표기 의미 "과 왼쪽으로 축"을 제공 할 것이있다. ...ijkl을 의미합니다. 명시하지 않아도에 대한

하나 좋은 점은 그 크기> = 2 (너무 오래 지난 두 동일한 길이를 가지고), 반면

임의의 수의

np.einsum('...mm->...m', arr) 

작품 똑같이와 배열

np.einsum('ijklmm->ijklm', arr) 

arr의 크기가 정확히 6 일 때만 작동합니다.


타원이 중간에 나타나면 "모든 중간 명시 적으로 언급되지 않은 축"에 대한, 그것은 속기입니다. 예를 들어, np.einsum('ijklmi->ijklm', arr)np.einsum('i...i->i...', arr)과 같습니다. 여기에 ...jklm 스탠드 :

arr = np.random.random((6,2,3,4,5,6)) 
result = np.einsum('ijklmi->ijklm', arr) 
result2 = np.einsum('i...i->i...', arr) 
assert np.allclose(result, result2)