我想知道,如何正确保存和加载numpy.array
数据。目前我使用的是numpy.savetxt()
方法。例如,如果我得到一个数组markers
,它看起来像这样。
!
我尝试用以下方法来保存它。
numpy.savetxt('markers.txt', markers)
在另一个脚本中,我试图打开之前保存的文件。
markers = np.fromfile("markers.txt")
而这就是我得到的结果......
保存的数据首先看起来像这样。
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 我没有进行其他的后台操作。只是保存和加载,而这就是我得到的结果。请先谢谢你。
我发现最可靠的方法是使用np.savetxt
和np.loadtxt
,而不是np.fromfile
,后者更适合用tofile
写入二进制文件。np.fromfile
和np.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.save
和np.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)
np.fromfile()
有一个sep=
的关键字参数。
如果文件是一个文本文件,则项目之间的分隔符。空的("")分隔符意味着文件应被视为二进制文件。分隔符中的空格("")与零个或多个空白字符相匹配。仅由空格组成的分隔符必须至少匹配一个空格。
默认值sep=""
意味着np.fromfile()
试图将其作为二进制文件而不是空格分隔的文本文件来读取,所以你会得到无意义的值。如果你使用np.fromfile('markers.txt', sep="")
你会得到你想要的结果。
然而,正如其他人所指出的,np.loadtxt()
是将文本文件转换为numpy数组的首选方式,除非文件需要是人类可读的,否则通常最好使用二进制格式来代替(例如np.load()
/np.save()
)。