【问题标题】:Calculate a trace of large matrix in python在python中计算大矩阵的痕迹
【发布时间】:2018-11-06 03:33:58
【问题描述】:

我有一个矩阵 X,我需要编写一个函数来计算矩阵 的轨迹。

我写了下一个脚本:

import numpy as np
def test(matrix):
    return (np.dot(matrix, matrix.T)).trace()

np.random.seed(42)
matrix = np.random.uniform(size=(1000, 1))

print(test(matrix))

它在小矩阵上运行良好,但是当我尝试在大矩阵上计算时(例如在形状为 (50000, 1) 的矩阵上),它给了我一个内存错误。

我试图在网站上的其他问题中找到问题的解决方案,但没有任何帮助。如有任何建议,我将不胜感激!

【问题讨论】:

标签: python numpy


【解决方案1】:

您尝试计算的数字只是X 的所有条目的平方和。对平方求和,而不是计算一个充满您不想要的条目的巨大矩阵乘积:

return (X**2).sum()

或者解开矩阵并使用dot,这对于连续的X可能更快:

raveled = X.ravel()
return raveled.dot(raveled)

实际上,ravel 对于非连续的X 可能也更快 - 即使ravel 需要复制,它也不会比(X**2).sum() 进行更多分配。

【讨论】:

  • 现在我在考虑之前立即联系einsum 感到很愚蠢。 ;-)
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
相关资源
最近更新 更多