2014-02-13 71 views
1

下面的代碼旨在對一組三維座標進行線性座標轉換。轉換矩陣爲A,包含座標的數組爲xx的第零軸在維度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

+0

FWIW你的代碼似乎工作的,是numpy的1.9.0.dev-b785070。 – DSM

+0

我注意到在我的numpy版本中有至少一個其他的錯誤(帶有三個操作數的錯誤結果),所以如果這是第二個錯誤,我不會感到驚訝。我認爲einsum是在v1.6.0中引入的。 – Thucydides411

+0

'x_prime = np.einsum('... ij,j ...-> i ...',A,x)'也應該有效。這個問題在'http:// stackoverflow.com/questions/16591696/ellipsis-broadcasting-in-numpy-einsum /'中提出,並在最新的代碼中得到糾正。 – hpaulj

回答

3

是的,這是一個錯誤。它被固定在這個請求中:https://github.com/numpy/numpy/pull/4099

這個只在一個月前合併過了,所以它會在一個穩定版本發佈之前過一段時間。

編輯:作爲@hpaulj提到的評論,你可以解決這一限制通過添加即使在規定的全部指標省略號:

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

如果您從@ hpaulj的評論添加建議,則此答案將成爲現實。其他人在未來一段時間可能會遇到同樣的問題,因爲下一個穩定版本的numpy需要一段時間才能包含在主要的發行版中(Ubuntu 14.04 LTS可能不會包含它,CentOS需要很長時間才能發佈新版本等)。 – Thucydides411

+0

@ Thucydides411:謝謝,完成。 – perimosocordiae