아래 코드는 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을 오해하고 있습니까?
FWIW 코드가 NumPy와의-그대로 작동하는 것 같다 : @hpaulj이 코멘트에 언급, 당신은 모든 인덱스가 지정된 경우에도 줄임표를 추가하여이 문제를 해결 할 수 있습니다 1.9.0.dev-b785070. – DSM
numpy (3 피연산자가있는 잘못된 결과) 버전에서 einsum과 관련된 버그가 하나 이상 있음을 발견했습니다. 두 번째 버그 인 경우 놀랄 일이 아닙니다. 제 생각에 einsum은 v1.6.0에서 소개되었습니다. – Thucydides411
'x_prime = np.einsum ('... ij, j ...- i ...', A, x)'도 작동해야합니다. 이 문제는'http : // stackoverflow.com/questions/16591696/ellipsis-broadcast-in-numpy-einsum /'에서 제기되었으며 최신 코드로 수정되었습니다. – hpaulj