Numpy提供了很多文件存取函数。文件格式分为文本文件和二进制文件,numpy分别提供了对文本文件操作的方法(np.savetxt()、np.loadtxt())和对二进制文件操作的方法(np.save()、np.savez()、np.load()、tofile()、np.fromfile())。而二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型,对格式化二进制类型文件操作的方法为:np.save()、np.savez()、np.load();对无格式类型文件操作的方法为:tofile()、np.fromfile()。
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
np.savetxt('a.txt', a) #将数组a的数据保存入文件a.txt中
b = np.loadtxt('a.txt') #读取文件a.txt中的数据
print(b)
文件中数据可以指定分隔符
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
np.savetxt('a.txt', a, delimiter = ',')
b = np.loadtxt('a.txt', delimiter = ',')
print(b)
可以指定数据存储格式,默认以float64格式存储
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
np.savetxt('a.txt', a, delimiter = ',', fmt = '%d')
b = np.loadtxt('a.txt', delimiter =',')
print(b)
'''读写npy文件'''
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
np.save('a.npy', a)
b = np.load('a.npy')
print(b)
'''读写npz文件,npz文件可存储多个数组的数据'''
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.arange(10)
np.savez('data.npz', data1 = a, data2 = b)
data = np.load('data.npz') #返回键,键为数组名,通过键索引对应的数组
print(data.keys()) #打印键
print(data.keys()[0], data[data.keys()[0]]) #打印键值对
print(data.keys()[1], data[data.keys()[1]])
import numpy as np
a = np.arange(12)
a = a.reshape(3, 4) #注意这里赋值号右边并未有改变a的形状,所以需要改变后赋给a。或者用a.shape = 3, 4
a.tofile('a.bin') #以int类型写入数据
b = np.fromfile('a.bin', dtype = np.float) #按照float类型读入数据
print(b)
输出:
很明显,读出的数组中的数据是错误的,所以读取数据时,数据类型必须与写入时数组中的数据类型一致!
import numpy as np
a = np.arange(12)
a = a.reshape(3, 4) #注意这里赋值号右边并未有改变a的形状,所以需要改变后赋给a。或者用a.shape = 3, 4
a.tofile('a.bin') #以int类型写入数据
b = np.fromfile('a.bin', dtype = np.int32) #按照int32类型读入数据(注意这里和之前的不同)
print(b)
输出:
数组的内容正确了, 但是注意!数组的形状和写入的数组形状不同(写入的是a.shape = 3, 4),因此写入数据时没有保存数组形状信息,这里要自己改变一下数组形状。
import numpy as np
a = np.arange(12)
a = a.reshape(3, 4) #注意这里赋值号右边并未有改变a的形状,所以需要改变后赋给a。或者用a.shape = 3, 4
print('a = ', a)
a.tofile('a.bin') #以int类型写入数据
b = np.fromfile('a.bin', dtype = np.int32) #按照float类型读入数据
print('b = ', b)
'''添加如下语句'''
b.shape = a.shape
print('b = ', b)
输出:
数组b形状变为3*4了。
从上面的讨论可以看出,tofile()函数以二进制格式将数据写入文件时,写入的数据没有格式(数组形状和数组中的数据类型),所以,在从文件中读取数据时,需要设置读出数据的格式,并且设置的数据类型必须与写入时的数据类型一致,否则读出的数据会出错。
import numpy as np
a = np.arange(12)
a = a.reshape(3, 4) #或者用a.shape = 3, 4
print('a = ', a)
a.tofile('a.bin', sep = ',') #以int类型写入数据,sep为设置的分隔符,这里以逗号分隔
b = np.fromfile('a.bin', dtype = np.int32, sep = ',') #按照float类型读入数据
print('b = ', b)
b.shape = a.shape
print('b = ', b)