雖然與形狀鬼混可能使你所要完成更清楚,處理這類問題沒有想得太多了最簡單的方法是用np.einsum
:
In [5]: np.einsum('ij, jkl', M, a)
Out[5]:
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[ 10, 11, 12, 13, 14],
[ 15, 16, 17, 18, 19]],
[[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]],
[[-40, -41, -42, -43, -44],
[-45, -46, -47, -48, -49],
[-50, -51, -52, -53, -54],
[-55, -56, -57, -58, -59]]])
加上它常來與業績獎金:
In [17]: a = np.random.randint(256, size=(3, 1000, 2000))
In [18]: %timeit np.dot(M, a.swapaxes(0,1))
10 loops, best of 3: 116 ms per loop
In [19]: %timeit np.einsum('ij, jkl', M, a)
10 loops, best of 3: 60.7 ms per loop
編輯einsum
爲v強大的巫術力量。您還可以按照以下注釋做OP:
>>> a = np.arange(60).reshape((3,4,5))
>>> M = np.array([[1,0,0], [0,0,0], [0,0,-1]])
>>> M = M.reshape((3,3,1,1)).repeat(4,axis=2).repeat(5,axis=3)
>>> np.einsum('ijkl,jkl->ikl', M, b)
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[ 10, 11, 12, 13, 14],
[ 15, 16, 17, 18, 19]],
[[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]],
[[-40, -41, -42, -43, -44],
[-45, -46, -47, -48, -49],
[-50, -51, -52, -53, -54],
[-55, -56, -57, -58, -59]]])
謝謝!有沒有一種方法可以將元素乘法包含在Einsum中?例如,我有一個大小爲3xMxN的矢量陣列(如上所示),我想對每個矢量執行矩陣旋轉,大小爲3x3xMxN的張量M. ((3,4,5)) M =數組([[1,0,0], [0,0,0], [0,0,-1 ](a.shape [1])) M = M.reshape((3,3,1,1))。repeat(4,axis = 2).repeat(5,axis = 3) ): for arange(a.shape [2]): a [:,x,y] = M [:,:,x,y] .dot(a [:,x,y]) 什麼是正確的消解方法?我得到了: b = einsum('ijkl,jxy',M,a) c = b [:,0,0,:,] – emarti 2013-02-22 08:09:08
@emarti我編輯了我的答案來掩蓋您的問題評論。 – Jaime 2013-02-22 16:23:39
+1在答案中使用伏都教 – evan54 2014-11-15 04:51:06