bla*_*ody 4 numpy python-3.x numpy-ndarray array-broadcasting
我有两个具有相同形状的矩阵数组 A 和 B:\nA.shape = B.shape = (M,N,P)
\n\n我想计算沿 0 轴的克罗内克积,以便:
\n\nKP[ii,:,:] = A[ii,:,:]\xe2\x8a\x97B[ii,:,:]\nRun Code Online (Sandbox Code Playgroud)\n\n有没有一种方法可以在 numpy 中执行此操作而不使用 for 循环?
\n\n谢谢!
\n\n例子:
\n\nKP[ii,:,:] = A[ii,:,:]\xe2\x8a\x97B[ii,:,:]\nRun Code Online (Sandbox Code Playgroud)\n\n这相当于:
\n\nA = 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 ] )\nRun Code Online (Sandbox Code Playgroud)\n
您可以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)