python – 做列表外部产品的numpy方式

python – 做列表外部产品的numpy方式,第1张

概述我正在尝试对60000×100矩阵的外积进行归一化求和.我想用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_divid 我正在尝试对60000×100矩阵的外积进行归一化求和.我想用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))进行标准化.

内存优化解决方案

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

I.完整的循环解决方案

我们可以循环遍历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])

II.混合解决方案

在完整循环解决方案和在开始时列出的完全矢量化解决方案之间的A将包括一个循环,其将在每个列与整个阵列之间执行矩阵乘法.这将在每次迭代时进行60000X100 = 6000000总和减少.

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

以上是内存溢出为你收集整理的python – 做列表外部产品的numpy方式全部内容,希望文章能够帮你解决python – 做列表外部产品的numpy方式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1193934.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存