超大阵列的Numpy点积

2024-04-26 13:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个代码运行速度很慢的问题。用转置法计算一个非常大的二元矩阵(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]) .

Tags: 代码importtxtclosetimenpopenfile
2条回答

这听起来像是一个sparse matrix问题,scpy为其提供了一个package。这些是包含许多0元素的矩阵(如您的示例中所示)。操作将考虑稀疏性,矩阵将占用较少的内存空间。记住要做矩阵运算,比如FW.dot(WF)(使用这个而不是np.dot)。在

正如我在注释中所写的,输出数组的大小将是232GB(int64)。如果您不想将结果存储到磁盘上,那么使用h5py执行此任务将是一个合适的解决方案。在

对第一个轴的求和稍微简化了问题。如果你不想纯点积,我可以更新我的答案。但这会更复杂,更慢。在

res=np.zeros(WF.shape[1])
for i in range(WF.shape[1]):
  a=np.copy(WF[:,i])
  r=np.dot(FW,a)
  res[i] = np.sum(r)

相关问题 更多 >