python - Numpy Slicing - 从 3x3 数组计算矩阵 PseudoInverses 而无需迭代
问题描述
我有N个2x4数组存储在 ( 2x4xN ) 数组J
中。我正在尝试计算每个N、2x4数组的伪逆,并将伪逆保存到 (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
解决方案
我认为您需要指定如何转置 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))
推荐阅读
- node.js - 有没有办法用 Jasmine 测试功能而不暴露它们?
- java - 所需的请求部分“文件”不存在。尝试上传图片,角度 - >弹簧
- visual-studio-code - VS Code 路径自动完成到操作系统的根目录
- scala - 如何从 src/it 中导入在 src/test 目录中定义的包
- c++ - Qt 中定时器的正确使用
- c# - 我试图为每个返回返回 204 没有内容,除非调用 [Route("api/v1/status/0")] 或 [Route("api/v1/status/1")]
- javascript - 使用javascript通过一个元素合并2个json
- typescript - TypeScript:使用 Map 中的键作为类型
- google-maps - Google Maps Javascript API:沿方向的高程图
- sqlite - 当 String [] 是一个字段时,SQLite 按 String [] 中的位置排序