依次将点积应用于 3D numpy 数组的切片
Sequentially applying a dot product to slices of 3D numpy array
嗨 Stack Overflow 社区,
我有一个形状为 4x4x701 的 3D numpy 数组 Rp
,其中 701 个 4x4 切片中的每一个代表不同时间点的特定数量。我正在尝试有效地将 Givens 旋转矩阵 Q
及其 Hermitian 转置 QH
应用于 701 个切片中的每一个,并且目前正在迭代进行,如下所示:
for idx in np.arange(Rp.shape[-1]):
Rp[[j,k],:,idx] = np.dot(Q, Rp[[j,k],:,idx])
Rp[:,[j,k],idx] = np.dot(Rp[:,[j,k],idx], QH)
但必须有一种方法可以不迭代地执行此操作(用于 numpy 加速)。我意识到我可以只对第一种情况使用 np.dot
,但是如果没有一些换位,这对第二种情况不起作用,这似乎会减慢速度。
如有任何想法,我们将不胜感激!
形状粗略测试;值确实应该更具诊断性:
In [46]: Q = np.eye(4); QH = np.conj(Q)
In [47]: R = np.ones((10,4,4))
In [48]: (Q @ R @ QH).shape
Out[48]: (10, 4, 4)
In [49]: np.einsum('ij,kjl,lm->kil',Q,R,QH).shape
Out[49]: (10, 4, 4)
如果最后是大维度:
In [50]: Rp = R.transpose(1,2,0)
In [51]: Rp.shape
Out[51]: (4, 4, 10)
In [53]: np.einsum('ij,jlk,lm->ilk',Q,Rp,QH).shape
Out[53]: (4, 4, 10)
In [55]: (Q @ Rp.transpose(2,1,0) @ QH).transpose(1,2,0).shape
Out[55]: (4, 4, 10)
我们也可以这样写tensordot
。
In [58]: np.tensordot(QH,np.tensordot(Q,Rp,(1,1)),(0,1)).shape
Out[58]: (4, 4, 10)
嗨 Stack Overflow 社区,
我有一个形状为 4x4x701 的 3D numpy 数组 Rp
,其中 701 个 4x4 切片中的每一个代表不同时间点的特定数量。我正在尝试有效地将 Givens 旋转矩阵 Q
及其 Hermitian 转置 QH
应用于 701 个切片中的每一个,并且目前正在迭代进行,如下所示:
for idx in np.arange(Rp.shape[-1]):
Rp[[j,k],:,idx] = np.dot(Q, Rp[[j,k],:,idx])
Rp[:,[j,k],idx] = np.dot(Rp[:,[j,k],idx], QH)
但必须有一种方法可以不迭代地执行此操作(用于 numpy 加速)。我意识到我可以只对第一种情况使用 np.dot
,但是如果没有一些换位,这对第二种情况不起作用,这似乎会减慢速度。
如有任何想法,我们将不胜感激!
形状粗略测试;值确实应该更具诊断性:
In [46]: Q = np.eye(4); QH = np.conj(Q)
In [47]: R = np.ones((10,4,4))
In [48]: (Q @ R @ QH).shape
Out[48]: (10, 4, 4)
In [49]: np.einsum('ij,kjl,lm->kil',Q,R,QH).shape
Out[49]: (10, 4, 4)
如果最后是大维度:
In [50]: Rp = R.transpose(1,2,0)
In [51]: Rp.shape
Out[51]: (4, 4, 10)
In [53]: np.einsum('ij,jlk,lm->ilk',Q,Rp,QH).shape
Out[53]: (4, 4, 10)
In [55]: (Q @ Rp.transpose(2,1,0) @ QH).transpose(1,2,0).shape
Out[55]: (4, 4, 10)
我们也可以这样写tensordot
。
In [58]: np.tensordot(QH,np.tensordot(Q,Rp,(1,1)),(0,1)).shape
Out[58]: (4, 4, 10)