Python / Numpy IO 操作

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操作,在使用过程中注意区分。