python - Numpy中逐行外部产品的MemoryError
问题描述
我有两个矩阵。我在它们之间制作逐行的外部产品。我最初的目标是提高速度表现。我有关于样本的工作代码,但是当我想用 (+2000, +2000) 形状矩阵做它们时,我得到了MemoryError
。
我试图将它们转换为稀疏的,但这对于 3D 或 with 是不可能的einsum
(例如参见此评论)。
有没有办法解决这个问题?
以下是样本矩阵:
A
Out[10]:
array([[1, 1, 1, 1],
[0, 0, 1, 1],
[1, 1, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
B
Out[11]:
array([[0.25, 0. , 0.5 , 1. , 0. , 0. , 0. ],
[0.25, 0. , 0.5 , 0. , 1. , 0. , 0. ],
[0.25, 0.5 , 0. , 0. , 0. , 1. , 0. ],
[0.25, 0.5 , 0. , 0. , 0. , 0. , 1. ]])
这是一个做产品的例子:
A[:, :, None] * B.T[:, None, :]
Out[12]:
array([[[0.25, 0.25, 0.25, 0.25],
[0.25, 0.25, 0.25, 0.25],
[0.25, 0.25, 0.25, 0.25],
[0.25, 0.25, 0.25, 0.25]],
[[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0.5 , 0.5 ],
[0. , 0. , 0.5 , 0.5 ]],
[[0.5 , 0.5 , 0. , 0. ],
[0.5 , 0.5 , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ]],
[[1. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ]],
[[0. , 0. , 0. , 0. ],
[0. , 1. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ]],
[[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 1. , 0. ],
[0. , 0. , 0. , 0. ]],
[[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 1. ]]])
我也尝试用以下方法制作产品,结果相同:
np.einsum('ij, ik -> ikj', A, B.T)
和
np.matmul(A[:, :, None], B.T[:, None, :])
解决方案
推荐阅读
- flutter - 键盘出现时如何向上移动TextField?
- javascript - 如何自定义 360 产品查看器
- r - 是否可以提取在 gtsummary 中执行的统计测试的完整输出?
- javascript - React 如何在点击时更改组件图标外观?
- r - 将边缘属性添加到由 R 中的共现矩阵构造的网络
- javascript - 想要在 AXIOS ReactJs 中转换正确的 JSON 请求以发送到 django
- powershell - 没有行时如何使用powershell修改csv标头?
- sql - 如何从 SYBASE 数据库的存储过程中调用 DML 语句?
- excel - 计算以 S 开头的单元格的折扣
- jquery - 如何通过 ajax 将文件发送到 Django 服务器?