2016-07-12 58 views
1

我試圖向量化一個函數,它作爲其輸入一個3分量矢量「x」和一個3x3「基質」,併產生標量NumPy的 - 點積沿第三維度而不復制

def myfunc(x, matrix): 
    return np.dot(x, np.dot(matrix, x)) 

然而這需要被稱爲「n」次,並且向量x每次都具有不同的分量。我想修改這個函數,使得它輸入一些3xn數組(它的列是向量x),併產生一個向量,其分量是在每次迭代時計算出的標量。

我可以寫下一份愛因斯坦總結,它完成這項工作,但它需要我構建一個3x3xn的原始3x3「副本」堆棧。我擔心這樣做會消除我嘗試這樣做所帶來的性能收益。有沒有辦法計算我想要的矢量,而不需要製作3x3的副本?

回答

3

x爲3xN陣列,y爲3x3陣列。您正在尋找

z = numpy.einsum('ji,jk,ki->i', x, y, x) 

您還可能建立了3x3xN數組你作爲y爲了避免複製談論,但它是沒有必要的。

+0

非常感謝您的快速和簡單的解決方案!現在,請考慮它是如何工作的。 – FaceInvader