python - 不计算整个矩阵的 numpy 矩阵的对角线
问题描述
我有一个简单的代数问题,我想用numpy解决它(当然我可以用numba轻松解决它,但这不是重点)。
让我们考虑一个大小为 (mxn) 的第一个随机矩阵A,具有 na 个大值,以及一个大小为 (nxn)的第二个随机矩阵B。
A = np.random.random((1E6, 1E2))
B = np.random.random((1E2, 1E2))
我们要计算以下表达式:
np.diag(np.dot(np.dot(A,B),B.T))
问题是整个矩阵被加载到内存中,然后才提取对角线。是否可以以更有效的方式执行此操作?
解决方案
这就是我从你的起始表达中接近它的方式
np.diag(np.dot(np.dot(A,B),B.T))
您可以从对术语进行分组开始:
np.diag(np.dot(A, np.dot(B,B.T)))
然后只使用 A 的第一个相关(正方形)部分:
np.diag(np.dot(A[:B.shape[0], :], np.dot(B,B.T)))
然后通过自己进行元素乘法来避免额外的乘法(这将超出对角线):
np.sum( np.multiply(A[:B.shape[0], :].T, np.dot(B,B.T)), 0)
推荐阅读
- sql - Oracle - 将计算的数字字段与字符串字段连接起来
- asp.net-core - 是否可以访问另一个 blazor 电路?
- python - 从多种数据类型二维数组python中删除单引号
- java - 无法使用 Windows Biometric Framework 捕获图像数据
- java - Java AOP在构造对象时设置字段值
- c# - HTTP 错误 500.30 - ANCM 进程内启动失败 .NET Core
- c# - 如何将列表转换为c#中的expandobject键?
- c++ - OpenMP 任意缩减(合并)
- intellij-idea - Intellij 2019.3 在非常大的分辨率上表现缓慢。如何调整性能参数?
- javascript - FullCalendar 重复事件创建重复 BUG