Python 使用numpy快速更新矩阵
我的问题是,我需要从一个格式的文件中读取大约50万行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.
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分钟
有没有办法加快矩阵的计算速度?也许有一些函数可以完全从文件(或大块)读取数据,而不是逐行读取?有什么建议吗?一些想法:
- 与
引擎一起使用以读取文件。它比np.genfromtxt快得多,因为引擎是c/Cython优化的C
- 您可以在内存中读取整个文件,然后进行计算。这是最简单的方法,但从效率的角度来看,您的CPU在等待输入时大多处于空闲状态。这一次可以更好地用来计算东西
- 您可以尝试逐行读取和处理(例如:使用cvs模块)。虽然io仍然是最终的瓶颈,但您将已经处理了您的文件。这里的问题是,由于Python开销,您仍然会有一些效率损失
- 最好的组合可能是使用
和pandas.read\u csv
参数设置并一次处理块,按块读取。我打赌有一个最佳的块大小,它将击败其他方法chunk\u size
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万行执行这些操作?你能出示完整的代码吗?