首页 > 解决方案 > Numpy Slicing - 从 3x3 数组计算矩阵 PseudoInverses 而无需迭代

问题描述

我有N2x4数组存储在 ( 2x4xN ) 数组J中。我正在尝试计算每个N2x4数组的伪逆,并将伪逆保存到 (N x 4 x 2) 数组J_pinv中。

我目前在做什么:

J_pinvs = np.zeros((N, 4, 2))
for i in range(N):
    J_pinvs[i, :, :] = np.transpose(J[:, :, i]) @ np.linalg.inv(J[:, :, i] @ J[:, :, i].transpose())

这可行,但我想加快计算时间,因为这将在神经网络的一层中运行,所以我想让它尽可能快。

我试过的:

J_pinvs = np.zeros((N, 4, 2))
J_pinvs2[:, :, :] = np.transpose(J[:, :, :]) @ np.linalg.inv(J[:, :, :] @ J[:, :, :].transpose())

产生错误

<ipython-input-87-d8ee1ba2ae5e> in <module>
      1 J_pinvs2 = np.zeros((4, 2, 3))
----> 2 J_pinvs2[:, :, :] = np.transpose(J[:, :, :]) @ np.linalg.inv(J[:, :, :] @ J[:, :, :].transpose())

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 4 is different from 3)

有没有办法通过切片来做到这一点,这样我就不需要使用迭代器了?我很难在网上找到任何东西。任何帮助/建议将不胜感激!

谢谢,JM

标签: pythonarraysnumpyslice

解决方案


我认为您需要指定如何转置 3-D 数组:

np.linalg.inv(a @ a.transpose(0,2,1))

将工作。作为反对

# sample data
a = np.arange(24).reshape(-1,2,4)

a.shape 
# (3, 2, 4)

a.transpose().shape
# (4, 2, 3)

a @ a.transpose()

不管用。

最后,整个脚本应该是:

a.transpose(0,2,1) @ np.linalg.inv(a @ a.transpose(0,2,1))

推荐阅读