Python 使用numpy快速更新矩阵

Python 使用numpy快速更新矩阵,python,arrays,numpy,file-io,matrix,Python,Arrays,Numpy,File Io,Matrix,我的问题是,我需要从一个格式的文件中读取大约50万行 x1 "\t" x2 "\t" .. x10 "\t" count 然后用A[j][i]=总和(所有行)计数*x_i*x_j计算矩阵A 我尝试了两种方法,每行都读取文件行: 1) 保留Python矩阵并在for循环中更新: for j in range(size): for i in range(size): A[j][i] += x[j] * x[i] * count 2) 创建numpy数组,并使用numpy.

我的问题是,我需要从一个格式的文件中读取大约50万行

x1 "\t" x2 "\t" .. x10 "\t" count
然后用A[j][i]=总和(所有行)计数*x_i*x_j计算矩阵A

我尝试了两种方法,每行都读取文件行:

1) 保留Python矩阵并在for循环中更新:

  for j in range(size):
    for i in range(size):
      A[j][i] += x[j] * x[i] * count
2) 创建numpy数组,并使用numpy.add进行更新:

  numpy.add(A, count * numpy.outer(x, x))
令我惊讶的是,第二种方法比第一种方法慢了30%左右。两个都很慢-整个文件大约10分钟

有没有办法加快矩阵的计算速度?也许有一些函数可以完全从文件(或大块)读取数据,而不是逐行读取?有什么建议吗?

一些想法:

  • C
    引擎一起使用以读取文件。它比np.genfromtxt快得多,因为引擎是c/Cython优化的
  • 您可以在内存中读取整个文件,然后进行计算。这是最简单的方法,但从效率的角度来看,您的CPU在等待输入时大多处于空闲状态。这一次可以更好地用来计算东西
  • 您可以尝试逐行读取和处理(例如:使用cvs模块)。虽然io仍然是最终的瓶颈,但您将已经处理了您的文件。这里的问题是,由于Python开销,您仍然会有一些效率损失
  • 最好的组合可能是使用
    pandas.read\u csv
    chunk\u size
    参数设置并一次处理块,按块读取。我打赌有一个最佳的块大小,它将击败其他方法

根据计算机上可用的内存大小,您可以尝试使用正则表达式解析值,并通过numpy整形和切片应用计算。如果内存用完了,考虑类似的方法,但是读取文件,比如1M行块。
txt = open("C:/temp/input.dat").read()
values = re.split("[\t|\n]", txt.strip())

thefloats = [ float(x) for x in values]
mat = np.reshape(thefloats, (num_cols, num_rows))

for i in range(len(counts)):
    mat[:-1,i] *= counts[-1,i]   

矩阵是对称的,使用第一种方法只计算上半部分(每行55次计算,而不是100次)

第二种方法比较慢。我不知道为什么,但是,如果您正在实例化50万个小ndarray,这可能是瓶颈,并且可能使用单个ndarray并复制每行数据

x = np.zeros((11,))
for l in data.readlines():
    x[:] = l.split()
    A+=np.outer(x[:-1],x[:-1])*x[-1]

可能导致加速

“\t”是制表符还是文件中内容的文字表示,您能在内存中读取整个文件吗?”\t”是制表符,整个文件为4.5 GB,因此适合内存,尽管我不知道它是否能加快计算速度…您可以延迟在
count
上乘法,直到
I
范围计算结束,因为
a1*c+a2*c+…+an*c=(a1+a2+…+an)*c
这10分钟中有多少时间是用来读取文件还是处理文件的?只是为了澄清一下:在您的示例中,
大小
是10,也就是说,
A
是一个10x10的矩阵,并且您正在对每50万行执行这些操作?你能出示完整的代码吗?