gpt4 book ai didi

python - 列表外积的numpy方式

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:48 25 4
gpt4 key购买 nike

我正在尝试对 60000x100 矩阵的外积进行归一化求和。我想用 numpy 的方式来做,因为我的解决方案在列表理解中受到 python for 循环的限制:

def covariance_over_time(X):
B = np.sum(np.array([np.outer(x, x) for x in X]),axis=0)
B = np.true_divide(B, len(X))
return B

请注意,即使此解决方案有效,它也是单线程的,因此当 X 有 60000 行和 100 列时速度非常慢。

我尝试过其他方法,如此处所述 on stackoverflow .链接中发布的答案适用于小矩阵,几秒钟错误后给我内存。你知道为什么吗? (注意:我有 6 TeraByte 的 RAM,所以我不太可能有内存问题,因为我根本看不到内存使用量在增长!)

最佳答案

您可以使用 np.dot 简单地使用矩阵乘法 -

B = X.T.dot(X)

然后,使用 np.true_divide(B, len(X)) 进行归一化。


内存优化解决方案

如果您仍然遇到内存错误,我们还有两个选项/方法。

我。完整的循环解决方案

我们可以遍历 X 的第二个轴(列),并使用两个循环在每一列与每一列之间执行矩阵乘法。现在,X 只有 100 列,因此,一个完整的循环解决方案只会迭代 100X100 = 10000 次,并且在每次迭代时执行 60000(X 中的行数)总和减少。

n = X.shape[1]
out = np.empty((n,n),dtype=X.dtype)
for i in range(n):
for j in range(n):
out[i,j] = X[:,i].dot(X[:,j])

二。混合解决方案

在完整的循环解决方案和一开始列出的完全矢量化的解决方案之间,将使用一个循环,该循环将在每个列与整个数组之间执行矩阵乘法。这将在每次迭代时执行 60000X100=6000000 和减少。

n = X.shape[1]
out = np.empty((n,n),dtype=X.dtype)
for i in range(n):
out[i] = X[:,i].dot(X)

关于python - 列表外积的numpy方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44122543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com