如何正确保存和加载numpy.array()数据?

2024-05-20 09:10:30 发布

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

我想知道,如何正确地保存和加载numpy.array数据。目前我正在使用numpy.savetxt()方法。例如,如果我得到一个数组markers,它如下所示:

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

我做错什么了?我没有其他的后台操作。只是储存和装载,这就是我得到的。提前谢谢你。


Tags: 文件数据方法numpytxt脚本np数组
3条回答

^{}有一个sep=关键字参数:

Separator between items if file is a text file. Empty (“”) separator means the file should be treated as binary. Spaces (” ”) in the separator match zero or more whitespace characters. A separator consisting only of spaces must match at least one whitespace.

默认值sep=""表示np.fromfile()尝试将其读取为二进制文件,而不是空格分隔的文本文件,因此会返回无意义的值。如果你使用np.fromfile('markers.txt', sep=" "),你会得到你想要的结果。

然而,正如其他人指出的,^{}是将文本文件转换为numpy数组的首选方法,除非该文件需要人类可读,否则通常最好使用二进制格式(例如np.load()/np.save())。

np.save('data.npy', num_arr) # save
new_num_arr = np.load('data.npy') # load

我发现最可靠的方法是将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)

相关问题 更多 >