python – 做列表外部产品的numpy方式
我正在尝试对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中描述的方法. 解决方法
您可以使用
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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |