我有一个运行代码很慢的问题。尝试通过转置计算非常大的二进制矩阵 (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,运行 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 问题,scipy 为其提供了 package 。这些是具有许多 0 元素的矩阵(如您的示例)。操作将考虑稀疏性,矩阵将占用更少的内存空间。记得做矩阵运算,比如 FW.dot(WF) (使用 this 而不是 np.dot )。

关于python - 非常大数组的 Numpy 点积,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48686428/

10-12 19:15