一般問題NumPy的:多重外積
假設我有形狀(nrow,ncols,3)
的ndarray
v
。我想計算形狀爲(nrow,ncols,3,3)
的ndarray outer_array
,其中包含形狀爲(3)
的載體的所有外部產物,其索引爲(nrow,ncol)
。當然,這是numpy.einsum
存在的那種問題。 現在,我已經試過是:
outer_array = numpy.einsum("xyi,xyj->xyij",v,v.conjugate())
現在,我不知道,這將工作:儘管outer_array
具有預期的形狀,外產品矩陣的元素不對應到我所期待的。
我認爲這是由於在einsum
表達標籤的選擇:產品應該在x
和y
來概括,因爲指數的反覆,但因爲我重用他們在輸出表達式,結果的總和是以某種方式廣播。
在另一方面,如果我寫:
outer_array = numpy.einsum("xyi,uvj->...ij",v,v.conjugate())
numpy的將計算外積的所有可能組合的每對(x,y)
和(u,v)
,導致形狀(ncols,nrow,ncols,nrow,3,3)
的陣列,其中該對角線(u,v) = (x,y)
將包含所需的輸出。
的確切的問題
如何選擇在einsum符號前兩個指標,以獲得一個數組,其中每個索引x,y
在我與自身載體v
的外積而不必訴諸到第二個表達式?
編輯 顯然,這種形式似乎太工作:
outer_array = numpy.einsum("...i,...j->...ij",v,v.conjugate())
我只能佩服numpy的廣播是多麼有用!
你能發表一個輸出的例子「不對應你所期待的」嗎?你的第一種方法似乎是正確的做法。 – Jaime
你確實是對的。意外結果的問題是由於另一個問題。我仍然想知道我的代碼如何管理工作,因爲索引'x'和'y'在條件中被重複並重新出現在輸出中。有人可以解釋嗎? – Bafe
這可能是相關的:http://stackoverflow.com/q/17138393/1461210 –