我有一个代码运行速度很慢的问题。用转置法计算一个非常大的二元矩阵(170544×22)的点积。 首先我试过这个代码
import numpy as np
start = time.time()
import warnings
warnings.filterwarnings("ignore", message='genfromtxt', category=UserWarning)
np.set_printoptions(threshold=np.nan)
fin = open('E:/myscripts/Abin.txt', 'rb') # input file (170544X22 binary matrix)
fin1 = open('E:/myscripts/AbinT.txt', 'rb') # input file (22X170544 binary matrix the transpose of Abin)
fout = open('E:/myscripts/RPartial.txt', 'w+b') # output file
FW = np.genfromtxt(fin,delimiter=',', dtype=int)
WF = np.genfromtxt(fin1,delimiter=',', dtype=int)
r = np.dot(FW,WF) #r calculation
np.savetxt(fout, r, fmt='%i' ,delimiter=',', newline='\r\n')
fin.close()
fin1.close()
fout.close()
但是有一个记忆错误。然后我用row方法改变了r的计算:
^{pr2}$代码现在可以工作了,但是它非常慢,90分钟后只计算了8000行。 硬件是I7,有12GB的ram,运行windows 64位。 如何加速代码?在
数据是这样的
([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0])
结果应该是
([15,14,14,14,14],
[14,15,14,14,14],
[14,14,15,14,14],
[14,14,14,15,14],
[14,14,14,14,15]) .
这听起来像是一个sparse matrix问题,scpy为其提供了一个package。这些是包含许多0元素的矩阵(如您的示例中所示)。操作将考虑稀疏性,矩阵将占用较少的内存空间。记住要做矩阵运算,比如
FW.dot(WF)
(使用这个而不是np.dot
)。在正如我在注释中所写的,输出数组的大小将是232GB(int64)。如果您不想将结果存储到磁盘上,那么使用h5py执行此任务将是一个合适的解决方案。在
对第一个轴的求和稍微简化了问题。如果你不想纯点积,我可以更新我的答案。但这会更复杂,更慢。在
相关问题 更多 >
编程相关推荐