1,文件的存取可以是二进制类型,也可以是文本文件。numpy的二进制文件又可以是有格式的和没有格式的类型。tofile()可以很简单的将数组以二进制的形式写进到文件里面,同时fromfile()也可以方便的读回数据。
>>> a
array([[1, 6, 6, 7],
[0, 1, 2, 3],
[1, 2, 7, 8]])
>>> a.tofile('a.bin')
>>> b=np.fromfile('a.bin',dtype=np.int32)
>>> b
array([1, 6, 6, 7, 0, 1, 2, 3, 1, 2, 7, 8])
>>> b.shape=3,4
>>> b
array([[1, 6, 6, 7],
[0, 1, 2, 3],
[1, 2, 7, 8]])
发现要保持原来的形式还是比较麻烦的。其实还有更加简单的命令:save(),load()简单直观。(注意扩展名)
>>> np.save('a.npy',a)
>>> c=np.load('a.npy')
>>> c
array([[1, 6, 6, 7],
[0, 1, 2, 3],
[1, 2, 7, 8]])
也可以使用savez()命令同时存储多个数组。
>>> np.savez('a.npz',a,b)
>>> d=np.load('a.npz')
>>> d['arr_0']
array([[1, 6, 6, 7],
[0, 1, 2, 3],
[1, 2, 7, 8]])
>>> d['arr_1']
array([[1, 6, 6, 7],
[0, 1, 2, 3],
[1, 2, 7, 8]])
若是存储为文本文件,使用:savextxt(),loadtxt(),可以处理一维,二维数组文件。也可以用这两个命令读写CSV格式的文本文件。
>>> a
array([[1, 6, 6, 7],
[0, 1, 2, 3],
[1, 2, 7, 8]])
>>> np.savetxt('a.txt',a)
>>> np.loadtxt('a.txt')
array([[ 1., 6., 6., 7.],
[ 0., 1., 2., 3.],
[ 1., 2., 7., 8.]])
其实在python中可以open()命令来读出txt文件,然后使用readlines()命令读取整个文件。
2,内存映射,当需要存取一个很大的文件里面的小部分的数据的时候,读入整个文件显然是非常的浪费资源的。于是要使用到内存映射的方法。
memmap(filename,dtype=uint8,mode=“r+”,offset=0,shape,order=‘C’)其中,offset是文件中存储数据的起始位置;mode可以是c(不写入的修改)r+(可读写)w+(创建或是覆盖已有文件)。
>>> a
memmap([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]], dtype=uint8)
>>> file('tem.dat').read()
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> a[:]=ord('a') # 加入的是a的ASCII码
>>> a.flush()
>>> file('tem.dat').read()
'aaaaaaaaaa'
到此,numpy中个人觉得比较重要的知识点就学习完了。接下来将会学习的是matplotlib绘图,后面还要学习一种python的UI,接下来是python opencv。敬请期待!
参考书目:
《python科学计算》
《机器学习实战》