2014-02-13 5 views
1

아래 코드는 3 차원 좌표 집합에 대해 선형 좌표 변환을 수행하기위한 것입니다. 변환 행렬은 A이고 좌표를 포함하는 배열은 x입니다. x의 0 번째 축은 x, y, z 차원에서 실행됩니다. 그것 이상으로 임의의 모양을 가질 수 있습니다.numpy einsum with '...'

A = np.random.random((3, 3)) 
x = np.random.random((3, 4, 2)) 

x_prime = np.einsum('ij,j...->i...', A, x) 

출력은 다음과 같습니다 : I 명시 적으로 x에 추가 첨자를 지정하는 경우

x_prime = np.einsum('ij,j...->i...', A, x) 

ValueError: operand 0 did not have enough dimensions 
to match the broadcasting, and couldn't be extended 
because einstein sum subscripts were specified at both 
the start and end 

는 오류가 도망 간다

여기 내 시도입니다. 즉, 다음 작품에서 :

x_prime = np.einsum('ij,jkl->ikl', A, x) 

나는 x가 제로 번째 축 후 축의 임의의 번호를 가지고 수 있도록하고 싶습니다, 그래서 대해주는 해결 방법은 최적이 아니다. 실제로 첫 번째 einsum 예제가 작동하지 않는 이유는 확실하지 않습니다. 나는 numpy 1.6.1을 사용하고있다. 이 버그입니까, 아니면 documentation을 오해하고 있습니까?

+0

FWIW 코드가 NumPy와의-그대로 작동하는 것 같다 : @hpaulj이 코멘트에 언급, 당신은 모든 인덱스가 지정된 경우에도 줄임표를 추가하여이 문제를 해결 할 수 있습니다 1.9.0.dev-b785070. – DSM

+0

numpy (3 피연산자가있는 잘못된 결과) 버전에서 einsum과 관련된 버그가 하나 이상 있음을 발견했습니다. 두 번째 버그 인 경우 놀랄 일이 아닙니다. 제 생각에 einsum은 v1.6.0에서 소개되었습니다. – Thucydides411

+0

'x_prime = np.einsum ('... ij, j ...- i ...', A, x)'도 작동해야합니다. 이 문제는'http : // stackoverflow.com/questions/16591696/ellipsis-broadcast-in-numpy-einsum /'에서 제기되었으며 최신 코드로 수정되었습니다. – hpaulj

답변

3

네, 버그입니다. 이 풀 요청에서 수정되었습니다 : https://github.com/numpy/numpy/pull/4099

이것은 한 달 전에 병합 되었기 때문에 안정 버전으로 전환되기까지 다소 시간이 걸립니다.

편집 :

np.einsum('...ij,j...->i...', A, x) 
+0

@ hpaulj의 의견에 제안을 추가하면이 답변에 대한 답변이 표시됩니다. 다른 사람들은 아마 다음 번 안정 버전의 주요 배포판에 포함될 때까지 약간의 시간이 걸릴 것입니다. (우분투 14.04 LTS는 아마도 그것을 포함하지 않을 것입니다. CentOS는 릴리스 할 나이가 들었습니다. 새 버전 등). – Thucydides411

+0

@ Thucydides411 : 감사합니다. – perimosocordiae