笔记:
Speed is not as important as getting a final result.
However, some speed up over worst case is required as well.
我有一个大数组A:
A.shape=(20000,265) # or possibly larger like 50,000 x 265
我需要计算相关系数。
np.corrcoeff # internally casts the results as doubles
我只是借用了他们的代码并编写了我自己的 cov/corr 而不是转换成双精度数,因为我真的只需要 32 位浮点数。而且我放弃了 conj(),因为我的数据总是真实的。
cov = A.dot(A.T)/n #where A is an array of 32 bit floats
diag = np.diag(cov)
corr = cov / np.sqrt(np.mutliply.outer(d,d))
我仍然内存不足,我正在使用一台大内存机器,264GB
有人告诉我,快速的 C 库可能正在使用将点积分解为多个部分的例程,为了优化这一点,元素的数量被填充为 2 的幂。
我真的不需要计算相关系数矩阵的对称一半。但是,我没有看到一种方法可以在合理的时间内通过 python 循环“手动”执行此操作。
有谁知道向 numpy 询问一个体面的点积例程的方法,它可以平衡内存使用与速度......?
干杯
更新:
有趣的是,写这些问题有助于我找到更好的谷歌查询语言。
发现这个:
http://wiki.scipy.org/PerformanceTips
不确定我是否遵循它....所以,请评论或提供有关此解决方案的答案、您自己的想法,或者只是对此类问题的一般评论。
TIA
编辑:我很抱歉,因为我的数组比我想象的要大得多。数组大小实际上是 151,000 x 265 我在一台 264 GB 且至少有 230 GB 可用空间的机器上内存不足。
我很惊讶对 blas dgemm 的 numpy 调用并小心使用 C 顺序数组并没有蹲下。