非常大的阵列的Numpy dot产品

时间:2018-02-08 13:17:33

标签: python numpy

我遇到运行代码非常慢的问题。尝试通过其转置来计算非常大的二进制矩阵(170544 X 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() 

但是存在内存错误。然后我用行方法改变了r计算:

for row in FW:
    a=FW[row,:]
    r = np.dot(a,WF)
    np.savetxt(fout, r,  fmt='%i' ,delimiter=',', newline='\r\n')

代码现在有效,但速度很慢,90分钟后只计算了8000行。 硬件是带有12GB内存的I7,运行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]) .

2 个答案:

答案 0 :(得分:0)

这听起来像sparse matrix问题,而scipy提供package。这些是具有许多0元素的矩阵(如您的示例中所示)。操作将考虑稀疏性,矩阵将占用更少的内存空间。请记住执行FW.dot(WF)之类的矩阵运算(使用此而不是np.dot)。

答案 1 :(得分:0)

正如我在评论中所写,输出数组的大小为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)