欢迎关注公众号【Python开发实战】,免费领取Python学习电子书!
工具-numpy
numpy是使用Python进行数据科学的基础库。numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变换和随机数函数。
保存和加载
numpy可以方便地以二进制或文本格式来保存和加载ndarray。
二进制格式 .npy
下面创建一个随机的ndarray,并保存。
a = np.random.rand(2, 3)
a
输出:
array([[0.76953407, 0.79648012, 0.8868019 ],
[0.88131806, 0.57297333, 0.70059907]])
np.save('my_array', a)
由于文件名不包含扩展名,因此numpy会自动添加扩展名为.npy,下面查看一下文件内容:
with open('my_array.npy', 'rb') as f:
content = f.read()
content
输出:
b"\x93NUMPY\x01\x00v\x00{'descr': '<f8', 'fortran_order': False, 'shape': (2, 3), } \n0L\xbb\xe8\x05\xa0\xe8?\x13s\x00\xdf\xc3|\xe9?\xdd\x05\xf4`\xae`\xec?S\x0e\xad\xee\xc13\xec?\x03\xa6E)\xccU\xe2?\x97\xc6\xdc\xbcNk\xe6?"
想要把该文件加载到numpy数组中只需要调用load函数。
a_loaded = np.load('my_array.npy')
a_loaded
输出:
array([[0.76953407, 0.79648012, 0.8868019 ],
[0.88131806, 0.57297333, 0.70059907]])
文本格式
现在以文本格式来保存ndarray。
np.savetxt('my_array.csv', a)
现在查看一下文件内容:
with open('my_array.csv', 'rt') as f:
print(f.read())
输出:
7.695340676822350900e-01 7.964801173689884939e-01 8.868019002549619723e-01
8.813180600777265061e-01 5.729733282179839682e-01 7.005990685194828371e-01
这是以制表符作为分隔符的csv文件,还可以设置不同的分隔符。
np.savetxt('my_array.csv', a, delimiter=',')
再查看一下文件内容
with open('my_array.csv', 'rt') as f:
print(f.read())
输出:
7.695340676822350900e-01,7.964801173689884939e-01,8.868019002549619723e-01
8.813180600777265061e-01,5.729733282179839682e-01,7.005990685194828371e-01
加载该文件,只需要调用loadtxt函数。
a_loaded = np.loadtxt('my_array.csv', delimiter=',')
a_loaded
输出:
array([[0.76953407, 0.79648012, 0.8868019 ],
[0.88131806, 0.57297333, 0.70059907]])
压缩格式 .npz
还可以在一个压缩文件中保存多个ndarray。
b = np.arange(24).reshape(2, 3, 4)
b
输出:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
np.savez('my_arrays', my_a=a, my_b=b)
现在看一下文件内容,文件的扩展名.npz已经自动添加。
with open('my_arrays.npz', 'rb') as f:
content = f.read()
repr(content)[:180] + '[...]'
输出:
'b"PK\\x03\\x04\\x14\\x00\\x00\\x00\\x00\\x00\\x00\\x00!\\x00&\\xa9j\\xe4\\xb0\\x00\\x00\\x00\\xb0\\x00\\x00\\x00\\x08\\x00\\x00\\x00my_a.npy\\x93NUMPY\\x01\\x00v\\x00{\'descr\': \'<f8\', \'fortran_order\': False, \'s[...]'
然后可以这样加载这个文件。
my_arrays = np.load('my_arrays.npz')
my_arrays
输出:
<numpy.lib.npyio.NpzFile at 0x93b8080>
这是一个类似字典的对象,它会懒加载ndarray。
my_arrays.keys()
输出:
['my_a', 'my_b']
my_arrays['my_a']
输出:
array([[0.76953407, 0.79648012, 0.8868019 ],
[0.88131806, 0.57297333, 0.70059907]])
my_arrays['my_b']
输出:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])