gpt4 book ai didi

Python-性能-将大型 numpy 数组作为字符串打印到选项卡文件

转载 作者:行者123 更新时间:2023-12-01 03:54:38 24 4
gpt4 key购买 nike

我最近有this帖子,其中我被协助从两个较小的矩阵制作一个大矩阵。生成的矩阵是正确的,创建乘法 numpy 数组需要 < 10 分钟,但是打印到文件需要很长时间(> 7 小时)。最终矩阵为 108887x55482,完成后文件大小为 12Gb。

任何人都可以协助使用以下代码将“newmat”以制表符分隔的方式打印到输出文件吗?我需要将 mat2 id 作为列标题,将 mat1 id 作为行[0]。

#!/usr/bin/env python

import numpy as np

print '\n######################################################################################'
print 'Generating matrix.'
print '########################################################################################\n'


print "Opening files, creating lists of lists for numpy arrays.."

def open_files(file):
with open(file, 'r') as f:
ids = []
vals = []
next(f)
for line in f:
ids.append(line.strip().split('\t')[0])
vals.append(line.strip().split('\t')[1:])
print len(ids)
print len(vals)
return ids, vals

mat1ids, mat1vals = open_files('matrix1.txt')
mat1ids, mat1vals = open_files('matrix2.txt')

print 'Total Mat1: ' + str(len(mat1ids))
print 'Total Mat2: ' + str(len(mat2ids)), '\n'
print 'Generating arrays..'

mh = np.int8(mat1vals)
mk = np.int8(mat2vals)

print 'Generating new matrix..'
newmat = mh.dot(mk.T)

print len(newmat)

print 'Printing results to outfile..'

with open('test_numpy_matrix.txt', 'w') as out:
print >> out, '\t', '\t'.join(mat2ids)
for i in range(len(mat1ids)):
print >> out, mat1ids[i], '\t', '\t'.join(str(x) for x in new[i])

print '\n######################################################################################'
print 'Matrix complete.'
print '########################################################################################\n'

更新np.savetxt 所花费的时间与循环遍历数组中的每个元素一样长。我可以使用 np.savetxt 将 mat2 id 作为列标题,但不能将 mat1 id 添加为最终矩阵中的 row[0]。

最佳答案

对于文本输出,还有 Numpy 数组 tofile方法。这是一个快速基准:

import numpy as np

data = np.random.randint(49, size=(55000))
f = open('test.txt', 'w')

print "original:"
%timeit f.write('\t'.join(str(x) for x in data))
print ".tofile text mode:"
%timeit data.tofile(f, '\t')

输出:

original:
10 loops, best of 3: 192 ms per loop
.tofile text mode:
10 loops, best of 3: 27.2 ms per loop

这是一个不错的小加速。那么你的循环将如下所示:

with open('test_numpy_matrix.txt', 'w') as out:
print >> out, '\t', '\t'.join(mat2ids)
for i in range(len(mat1ids)):
out.write(mat1ids[i] + '\t')
new[i].tofile(out, '\t')
out.write('\n')

另一方面,二进制文件格式可能会快一个数量级,文件大小也小 3 倍。试试 numpy.save在完整的 new 数组上查看您获得的速度。也许将行 ID 和列 ID 存储在单独的文件中?

关于Python-性能-将大型 numpy 数组作为字符串打印到选项卡文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37684059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com