Numpy IO 操作
ndarray 对象可以保存到磁盘文件并从磁盘文件加载。常用的 IO 函数有:
- load() 和 save() 函数是读写文件数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中;
- savez() 函数用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中;
- loadtxt() 和 savetxt() 函数处理正常的文本文件(txt等文本文件);
1. npz文件的保存与读取
1.1 numpy.save 函数
numpy.save() 函数将数组保存到以 .npy 为扩展名的文件中。函数原型如下:
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
参数说明如下:
参数 | 说明 |
---|---|
file | 要保存的文件,扩展名为 .npy,如果文件路径末尾没有扩展名 .npy,该扩展名会被自动加上 |
arr | 要保存的数组 |
allow_pickle | 可选,布尔值,允许使用 Python pickles 保存对象数组,Python 中的 pickle 用于在保存到磁盘文件或从磁盘文件读取之前,对对象进行序列化和反序列化。 |
fix_imports | 可选,为了方便 Pyhton2 中读取 Python3 保存的数据。 |
案例
定义数组:
a = np.array([1, 2, 3, 4, 5, 6])
将数组保存到 outfile_a.npy 文件上:
np.save('outfile_a.npy', a)
如果你尝试打开 outfile_a.npy 文件,你会发现文件是乱码的,因为它们是 Numpy 专用的二进制格式后的数据。
1.2 numpy.savez 函数
numpy.savez 函数可以将多个数组保存到以 npz 为扩展名的文件中。函数原型如下是:
numpy.savez(file, *args, **kwds)
参数说明如下:
参数 | 说明 |
---|---|
file | 要保存的文件,扩展名为 .npy,如果文件路径末尾没有扩展名 .npy,该扩展名会被自动加上 |
args | 要保存的数组 |
kwds | 要保存的数组使用关键字名称 |
案例
定义数组:
b = np.array([11, 22, 33, 44, 55, 66])
c = np.array([10, 20, 30, 40, 50, 60])
将数组 a、b、c 保存到 outfile_abc.npz 文件上:
np.savez('outfile_abc.npz', a, b, arr_1d = c)
1.3 numpy.load函数
numpy.load 函数可以加载 .npy 或 .npz 文件,将数组还原。
案例
从 outfile_a.npy 文件中还原数组 a:
a_re = np.load('outfile_a.npy')
print(a_re)
还原结果为:
[1 2 3 4 5 6]
案例
从 outfile_abc.npz 文件中还原数组 a、b、c:
abc_re = np.load('outfile_abc.npz')
print(abc_re)
打印还原结果为:
<numpy.lib.npyio.NpzFile at 0x1be73ece550>
NpzFile 是一个 Numpy 提供的类似字典的对象,可以通过键值对进行访问:
print('NpzFile的对象名称为:')
for name in abc_re.keys():
print(name)
结果为:
NpzFile的对象名称为:
arr_1d
arr_0
arr_1
可以看到 .npz 文件中保存了 3 个 key,其中 arr_1d 是自定义的,arr_0 和 arr_1 是程序默认的。可以详细查看 key 对应的 value:
print('arr_1d:', abc_re['arr_1d'])
print('arr_0:', abc_re['arr_0'])
print('arr_1:', abc_re['arr_1'])
结果为:
arr_1d: [10 20 30 40 50 60]
arr_0: [1 2 3 4 5 6]
arr_1: [11 22 33 44 55 66]
观察发现:arr_0 和 arr_1 分别对应 a 和 b。
2. 文本文件的保存与读取
2.1 numpy.savetxt 函数
numpy.savetxt() 函数是以简单的文本文件格式存储数据。其函数原型为:
np.savetxt(file, arr, fmt="%d", delimiter=",")
参数说明如下:
参数 | 说明 |
---|---|
file | 要保存的文件 |
arr | 要保存的数组 |
fmt | 指定数组元素的保存格式 |
delimiter | 指定每行元素之间的分隔符 |
案例
将二维数组保存为本文文件,数据存储格式为整数,分隔符为‘,’:
arr = np.arange(16).reshape(4,4)
np.savetxt('outfile_2d.txt', arr, fmt='%d', delimiter=',')
找到 outfile_2d.txt 文件,双击打开,结果为:
0,1,2,3
4,5,6,7
8,9,10,11
12,13,14,15
2.2numpy.loadtxt 函数
numpy.loadtxt() 函数是从文本文件中恢复数组数据。其函数原型为:
np.loadtxt(file, dtype=int, delimiter=' ')
参数说明如下:
参数 | 说明 |
---|---|
file | 要读取的文件 |
dtype | 指定数组元素的格式 |
delimiter | 指定文本文件的分隔符 |
案例
从 outfile_2d.txt 文件中还原二维数组:
np.loadtxt('outfile_2d.txt', dtype=np.int32, delimiter=',')
out:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
3. 小结
本节讲述了Numpy提供文件保存与读取的常用操作。其中save()、savez()与load()是基于二进制文件的IO操作,savetxt()与loadtxt()是基于文本文件的IO操作,在使用过程中注意区分。