矩阵阵列的克罗内克积

bla*_*ody 4 numpy python-3.x numpy-ndarray array-broadcasting

我有两个具有相同形状的矩阵数组 A 和 B:\nA.shape = B.shape = (M,N,P)

\n\n

我想计算沿 0 轴的克罗内克积,以便:

\n\n
KP[ii,:,:] = A[ii,:,:]\xe2\x8a\x97B[ii,:,:]\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有一种方法可以在 numpy 中执行此操作而不使用 for 循环?

\n\n

谢谢!

\n\n

例子:

\n\n
KP[ii,:,:] = A[ii,:,:]\xe2\x8a\x97B[ii,:,:]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这相当于:

\n\n
A = np.array([ [[1,0],\n                [0,1]],\n               [[1,0],\n                [0,1]]\n            ])\n\nB = np.array([ [[1,0],\n                [0,-1]],\n               [[0,1],\n                [1,0]]\n            ])\n\nKP = np.array( [\n                [[1,0,0,0],\n                 [0,-1,0,0],\n                 [0,0,1,0],\n                 [0,0,0,-1]],\n                [[0,1,0,0],\n                 [1,0,0,0],\n                 [0,0,0,1],\n                 [0,0,1,0]]\n               ] )\n
Run Code Online (Sandbox Code Playgroud)\n

Pau*_*zer 5

您可以einsum通过一些练习来使用它,这非常直观,或者走经典的重塑和广播路线

A = np.array([ [[1,0],
                [0,1]],
               [[1,0],
                [0,1]]
            ])

B = np.array([ [[1,0],
                [0,-1]],
               [[0,1],
                [1,0]]
            ])

i,j,k = A.shape
i,l,m = B.shape
np.einsum("ijk,ilm->ijlkm",A,B).reshape(i,j*l,k*m)

# array([[[ 1,  0,  0,  0],
#         [ 0, -1,  0,  0],
#         [ 0,  0,  1,  0],
#         [ 0,  0,  0, -1]],
# 
#        [[ 0,  1,  0,  0],
#         [ 1,  0,  0,  0],
#         [ 0,  0,  0,  1],
#         [ 0,  0,  1,  0]]])
Run Code Online (Sandbox Code Playgroud)

等效的非 einsum 表达式:

(A[:,:,None,:,None]*B[:,None,:,None,:]).reshape(i,j*l,k*m)
Run Code Online (Sandbox Code Playgroud)