下面的代碼旨在對一組三維座標進行線性座標轉換。轉換矩陣爲A
,包含座標的數組爲x
。 x
的第零軸在維度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)
輸出是:
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
明確指定的其他標,錯誤消失。換句話說,以下工作:
x_prime = np.einsum('ij,jkl->ikl', A, x)
我想x
能夠具有零軸後軸上的任意數量的,所以我給有關解決辦法是不是最佳的。我實際上不確定爲什麼第一個einsum
示例不起作用。我正在使用numpy 1.6.1。這是一個錯誤,還是我誤解了documentation?
FWIW你的代碼似乎工作的,是numpy的1.9.0.dev-b785070。 – DSM
我注意到在我的numpy版本中有至少一個其他的錯誤(帶有三個操作數的錯誤結果),所以如果這是第二個錯誤,我不會感到驚訝。我認爲einsum是在v1.6.0中引入的。 – Thucydides411
'x_prime = np.einsum('... ij,j ...-> i ...',A,x)'也應該有效。這個問題在'http:// stackoverflow.com/questions/16591696/ellipsis-broadcasting-in-numpy-einsum /'中提出,並在最新的代碼中得到糾正。 – hpaulj