2015-02-10 104 views
11

我想知道,如何正确保存和加载numpy.array数据。目前我正在使用numpy.savetxt()方法。举例来说,如果我有一个数组markers,它看起来像这样:如何正确保存并加载numpy.array()数据?

enter image description here

我试图通过使用保存它:

numpy.savetxt('markers.txt', markers) 

在其他的脚本中,我尝试打开以前保存文件:

markers = np.fromfile("markers.txt") 

而这正是我得到...

enter image description here

保存的数据首先是这样的:

0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 
0.000000000000000000e+00 

但是,当我刚保存通过使用相同的方法,即加载数据。 numpy.savetxt()它看起来像这样:

1.398043286095131769e-76 
1.398043286095288860e-76 
1.396426376485745879e-76 
1.398043286055061908e-76 
1.398043286095288860e-76 
1.182950697433698368e-76 
1.398043275797188953e-76 
1.398043286095288860e-76 
1.210894289234927752e-99 
1.398040649781712473e-76 

我在做什么错了? PS没有我执行的其他“后台”操作。只需保存和加载,这就是我所得到的。先谢谢你。

+0

文本文件的输出是什么?为什么不直接写入CSV文件? – 2015-02-10 19:05:00

+1

您是否需要保存并加载为可读的文本文件?如果使用'np.save()'和'np.load()'保存/加载二进制文件,它会更快(并且文件会更紧凑)。 – 2015-02-10 19:11:12

+0

谢谢你的建议。它有帮助。但是,您能否解释为什么它是这样,以及是否有任何方法允许以* .txt格式保存数据并无需加载就加载数据?例如,当你想使用matlab,java或其他工具/语言。 – bluevoxel 2015-02-10 19:14:03

回答

29

我发现这样做的最可靠的方法是使用np.savetxtnp.loadtxt而不是np.fromfile,它更适合用tofile编写的二进制文件。 np.fromfilenp.tofile方法写入和读取二进制文件,而np.savetxt写入文本文件。 因此,例如:

In [1]: a = np.array([1, 2, 3, 4]) 
In [2]: np.savetxt('test1.txt', a, fmt='%d') 
In [3]: b = np.loadtxt('test1.txt', dtype=int) 
In [4]: a == b 
Out[4]: array([ True, True, True, True], dtype=bool) 

或者:

In [5]: a.tofile('test2.dat') 
In [6]: c = np.fromfile('test2.dat', dtype=int) 
In [7]: c == a 
Out[7]: array([ True, True, True, True], dtype=bool) 

我用前一种方法,即使是速度较慢,造成更大的文件(有时):二进制格式可以是平台相关的(例如,文件格式取决于系统的字节顺序)。

有一个平台独立格式NumPy的阵列,其可被保存并与np.savenp.load读:

In [8]: np.save('test3.npy', a) # .npy extension is added if not given 
In [9]: d = np.load('test3.npy') 
In [10]: a == d 
Out[10]: array([ True, True, True, True], dtype=bool) 
+6

'.npy'文件(例如'np.save()')*生成的文件*是独立于平台的,并且比文本文件更加紧凑且更快速。 – 2015-02-10 20:05:04

+0

谢谢,我忘了提及这一点。编辑。 – xnx 2015-02-10 20:16:52

1

np.fromfile()具有sep=关键字参数:

分隔符项之间如果文件是文本文件。空(“”)分隔符表示该文件应被视为二进制文件。分隔符中的空格(“”)匹配零个或多个空白字符。只包含空格的分隔符必须至少匹配一个空格。

sep=""默认值意味着np.fromfile()试图读取它作为一个二进制文件,而不是一个空格分隔的文本文件,所以你得到的废话值返回。如果您使用np.fromfile('markers.txt', sep=" "),您将得到您要查找的结果。

然而,正如其他人所指出的,np.loadtxt()是文本文件转换为numpy的阵列的首选方法,除非该文件需要是人类可读的,通常最好使用二进制格式,而不是(如np.load()/np.save()) 。