用python计算大矩阵的轨迹

用python计算大矩阵的轨迹,python,numpy,Python,Numpy,我有一个矩阵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))的矩阵上)

我有一个矩阵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)
)的矩阵上),它会给我一个内存错误


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

您试图计算的数字只是
X
的所有条目的平方和。求平方和,而不是计算一个巨大的矩阵积,其中包含您不想要的条目:

return (X**2).sum()
或者将矩阵展开并使用
,对于连续的
X
,这可能更快:

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

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

您试图计算的数字只是
X
所有项的平方和。求平方和,而不是计算一个巨大的矩阵积,其中包含您不想要的条目:

return (X**2).sum()
或者将矩阵展开并使用
,对于连续的
X
,这可能更快:

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

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

做更多的分配:
matrix.T.dot(matrix)
?这看起来像是matrix.T.dot(matrix)的复制品?这看起来像是现在的翻版,我觉得很傻,在考虑它之前,我会立即伸手去拿
einsum
。-)现在,我觉得自己很傻,因为在考虑之前,我会立即伸手去拿
einsum
。)