numpy文件存取数组内容

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文件的读写
    可用于保存和加载数据
    npz是压缩文件,其中包含多个npy文件
    save()和load()只能保存或读取npy文件
    savez()只能保存npz文件
    load()能读取npz文件
'''读写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]])

输出:
numpy文件存取数组内容_第1张图片

  • 二进制文件存取
    使用数组对象的方法tofile()可以方便地将数组中的数据以二进制的格式写进文件。tofile()输出的数据没有格式(数组中数据的类型dtype和数组的形状shape),因此numpy.fromfile()读取数据时需要自己格式化数据
  1. 以int类型写入数据,以float类型读取数据时,数据会出错
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)

输出:
在这里插入图片描述
很明显,读出的数组中的数据是错误的,所以读取数据时,数据类型必须与写入时数组中的数据类型一致!

  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.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)

输出:
numpy文件存取数组内容_第2张图片
数组b形状变为3*4了。
从上面的讨论可以看出,tofile()函数以二进制格式将数据写入文件时,写入的数据没有格式(数组形状和数组中的数据类型),所以,在从文件中读取数据时,需要设置读出数据的格式,并且设置的数据类型必须与写入时的数据类型一致,否则读出的数据会出错。

  1. 若写入数据时设置了分隔符,读取数据是也需要设置分隔符
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)

输出:
numpy文件存取数组内容_第3张图片

你可能感兴趣的:(numpy文件存取数组内容)