用Python从大型文本文件到稀疏矩阵

2024-06-16 09:28:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一种有效的方法来读取一个非常大的文本文件(大约2000000行)。大约90%的这些行(最后90%实际上)有三列格式,用于存储稀疏矩阵。在

这是我所做的。首先,我处理文件的前10%:

i=1
cpt=0
skip=0
finnum=0
indice=1 
vec=[]
mat=[]
for line in fileinput.input("MY_TEXT_FILE.TXT"):
if i==1:
    # skipping the first line
    skip = 1
if (finnum == 0)and(skip==0):
    # special reading operation for the first 10% (approximately)
    tline=shlex.split(line)
    ind_loc=0
    while ind_loc<len(tline):
    if (int(tline[ind_loc])!=0):
            vec.append(int(tline[ind_loc]))
        ind_loc=ind_loc+1   
if (finnum == 1)and(skip==0):
    print('finnum = 1')
    h=input()    
        break       
    if (' 0' in line):
    finnum = 1
if skip == 0:
    i=i+1
else:
    skip=0
    i=i+1
cpt=cpt+1

然后我把剩下的90%提取到一个列表中:

^{pr2}$

这样可以非常快速地读取文本文件,并且内存消耗很低。缺点是矩阵是一个字符串列表,每个字符串类似于:

>>> matrix[23]
'           5          11  8.320234929063493E-008\n'

我曾尝试在矩阵相结合的行上使用迭代过程shlex.分离从字符串列表转到数组的命令,但这非常耗时。在

你知道从字符串列表到数组的快速策略吗?在

我想知道的是,是否有比这个过程更快的方法:

A=[0]*len(matrix)
B=[0]*len(matrix)
C=[0]*len(matrix)
for i in range(len(matrix)):
     line = shlex.split(matrix[i])
     A[i]=float(line[0])
     B[i]=float(line[1])
     C[i]=float(line[2])

阿兰


Tags: 字符串in列表forlenifline矩阵
2条回答

当您处理大量的数字数据时,您应该真正使用Numpy,而不是纯python。这通常要快10倍以上,并且可以让您访问Matlab风格的复杂计算。我现在没有时间转换代码(有一个示例文件是最容易的),但是可以肯定的是,使用numpy.loadtxt可以快速有效地读取文件的第二部分。跳过第一部分并转换为float的代码的第二部分可能可以这样完成:

A, B, C = np.loadtxt('MY_TEXT_FILE.TXT', skiprows = cpt, unpack = True)

您可能想使用数据格式(通过添加dtype = (int, int, float)左右,不知道如何做到这一点),因为我猜前两列是整数。在

还要注意,numpy有一个sparse matrix数据类型可用。在

听着,我想出了一个混合的解决方案,它似乎工作得更快。我创建了100万个样本随机数据,就像你上面提到的那样,并为你的代码计时。在我的Mac电脑里花了77秒,顺便说一句,这是一台超高速的电脑。 使用numpy而不是shlex拆分字符串只需5秒的处理过程。在

A=[0]*len(matrix)
B=[0]*len(matrix)
C=[0]*len(matrix)
for i in range(len(matrix)):
    full_array = np.fromstring(matrix[i], dtype=float, sep=" ")
    A[i]=full_array[0]
    B[i]=full_array[1]
    C[i]=full_array[2]

我做了几次测试,看起来效果不错,速度快了14倍。 我希望有帮助。在

相关问题 更多 >