虽然与形状鬼混可能使你所要完成更清楚,处理这类问题没有想得太多了最简单的方法是用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