我有很多.mat文件,其中包含有关某些不同波函数的径向部分的信息以及有关原子的一些其他信息。现在我成功提取了wavefunction部分并使用numpy.savetxt()将其保存到.txt文件中。但是文件的大小增加了很多: 我跑完后
du -ch wfkt_X_rb87_n=40_L=11_J=0_step=0.001.mat
440K wfkt_X_rb87_n=40_L=11_J=0_step=0.001.mat
du -ch wfkt_X_rb87_n=40_L=12_J=0_step=0.001.txt
2,9M wfkt_X_rb87_n=40_L=12_J=0_step=0.001.txt
忽略L = 11和L = 12的差异,波函数的大小几乎相同,但文件大小增加了6倍以上。我想知道原因,也许是减少.txt文件大小的方法。 以下是我如何隐藏文件的代码:
import scipy.io as sio
import os
import pickle
import numpy as np
import glob as gb
files=gb.glob('wfkt_X_rb*.mat')
for filet in files:
print filet
mat=sio.loadmat(filet)
wave=mat['wavefunction'][0]
J=mat['J']
L=mat['L']
n=mat['n']
xmax=mat['xmax'][0][0]
xmin=mat['xmin'][0][0]
xstep=mat['xstep'][0][0]
energy=mat['energy'][0][0]
name=filet.replace('.mat','.txt')
name=name.replace('rb','Rb')
x=np.linspace(xmin, xmax, num=len(wave), endpoint=False)
Data=np.transpose([x,wave])
np.savetxt(name,Data)
os.remove(filet)
with open(name, "a") as f:
f.write(str(energy)+" "+str(xstep)+"\n")
f.write(str(xmin)+" "+str(xmax))
,所需数据文件的格式为:
2.700000000000000000e+01 6.226655250941872093e-04
2.700099997457605738e+01 6.232789496263042460e-04
2.700199994915211121e+01 6.238928333406641843e-04
2.700299992372816860e+01 6.245071764542571872e-04
2.700399989830422243e+01 6.251219791839867897e-04
2.700499987288027981e+01 6.257372417466700075e-04
2.700599984745633364e+01 6.263529643590372287e-04
如果您需要更多信息,请随时提出!提前谢谢。
答案 0 :(得分:3)
.mat
是二进制格式,而numpy.savetxt()
写入纯文本文件。双精度数(IEEE 754双精度)的二进制表示需要8个字节。默认情况下,numpy将其保存为0.000000000000000000e+00
格式的纯文本,从而产生24个字节。
有许多其他影响会影响生成的文件大小。例如。文件格式的结构开销,压缩,用于写入纯文本的格式(十进制数字的数量)。但是在你的情况下,我怀疑主效应只是数字的二进制和纯文本表示之间的差异。
如果要减小文件大小,则应使用不同的输出格式。可能的选择是:
写一个压缩文本文件:
import gzip
with open('data.txt.gz', 'wb') as f:
numpy.savetxt(f, myarray)
再次保存为.mat
。请参阅scipy.io.savemat()
.npy
)。请参阅numpy.save() .npz
)。请参阅numpy.savez_compressed() 选择哪个选项取决于您的情况:之后谁将需要阅读数据?压缩系数有多重要?您的数据只是一个数组还是结构更复杂?