本节介绍的函数主要用来帮助我们完成数组的保存以及从文件加载 numpy 数组。
一. np.loadtxt、np.savetxt
首先,我们使用 Jupyter Notebook 中的魔法命令来写一个文件:
%%writefile example.txt
1 2 3 4
5 6 7 8
9 10 11 12
如果不使用 numpy 为我们提供的 API ,那么为了将文件中的内容读取到 numpy 数组,还是很费劲的:
data = []
with open('example.txt') as f:
for line in f:
fields = [float(x) for x in line.split()]
data.append(fields)
然后将嵌套列表 data
转换为 ndarray
结构:
>> data
[[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [9.0, 10.0, 11.0, 12.0]]
>> arr = np.array(data)
>> arr
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]])
1.1 从文本文件读取数组
numpy 为我们提供了 np.loadtxt
方法,可以轻松地将 example.txt
文本文件中的内容读取到 ndarray
:
>> arr2 = np.loadtxt('example.txt')
>> arr2
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]])
example.txt
文件中每行中的数字使用空格作为分隔符,如果是其它分隔符,可以在 loadtxt
中使用 delimiter
指定分隔符。
%%writefile example2.txt
0,1,2,3
4,5,6,7
8,9,10,11
读取 example2.txt
:
>> np.loadtxt('example2.txt', delimiter=',')
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
此外,还可以使用 skiprows
说明在读取时跳过前 n
行内容:
%%writefile example3.txt
a,b,c
0,1,2
3,4,5
跳过 1 行开始读取:
>> np.loadtxt('example3.txt', delimiter=',', skiprows=1)
array([[0., 1., 2.],
[3., 4., 5.]])
使用 usecols
读取指定的列到 ndarray
:
>> np.loadtxt('example2.txt', delimiter=',', usecols=(0,2))
array([[ 0., 2.],
[ 4., 6.],
[ 8., 10.]])
1.2 将数组保存到文本文件
>> arr = np.arange(9).reshape(3,3)
>> arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
使用 np.savetxt
将数组保存到文本文件:
>> np.savetxt('arr1.txt', arr)
默认保存的格式是科学计数法,分隔符为空格。下面使用 delimiter
和 fmt
来指定保存的分隔符和格式:
>> np.savetxt('arr2.txt', arr, delimiter=',', fmt='%.2f')
>> np.savetxt('arr3.txt', arr, delimiter=',', fmt='%d')
二. np.save、np.savez、np.load
除了将 ndarray
数组保存到文本文件之外,还可以使用 np.save
直接保存数组结构:
>> arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>> np.save('arr.npy', arr)
使用 np.load
读取上述保存的数组结构:
>> np.load('arr.npy')
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
使用 np.save
和 np.load
直接保存和读取 ndarray
是不是相比保存文件文件和从文本文件读取,省去了不少麻烦呢~
此外,还可以使用 np.savez
来将多个 ndarray
保存到一个文件,保存的文件类似压缩包的格式,里面包含了 ndarray
持久化的多个文件。
>> arr2 = np.ones_like(arr)
>> arr2
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
>> np.savez('arrs.npz', arr1=arr, arr2=arr2)
读取 arrs.npz
中保存的多个数组:
>> data = np.load('arrs.npz')
>> data
<numpy.lib.npyio.NpzFile at 0x154a47db198>
>> data.keys()
KeysView(<numpy.lib.npyio.NpzFile object at 0x00000154A47DB198>)
>> data['arr1']
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>> data['arr2']
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])