numpy文件 2018/11/11 2018/11/27
===================================================================
1.数组以二进制格式保存到磁盘
# 1.1.np.save和np.load读写磁盘数组数据。默认未压缩二进制格式保存在扩展名.npy
arr= np.arange(10)
np.save('array_file' , arr)#扩展名.npy 可省略
np.load('array_file.npy')#np.load读磁盘数组
#array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#1.2. np.savez多数组压缩到一个文件,数组以关键字参数形式传入
np.savez('array_file.npz' , a=arr, b=arr)
arch = np.load ('array_file.npz')#得到一个类似字典对象,对各个数组进行延迟加载
arch ['b'] #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
====================================================================
2.文本文件
# 实例1:
names= np.array( [ 'Bob','Joe ',' Will', ' Bob ' ])
np.savetxt('arr.txt',names,fmt='%s',delimiter=',')
np.loadtxt('arr.txt',dtype='S',delimiter=',')#array([b'Bob', b'Joe ', b' Will', b' Bob '], dtype='|S5')
np.loadtxt('arr.txt',dtype='U',delimiter=',')#array(['Bob', 'Joe ', ' Will', ' Bob '], dtype='<U5')
# 实例2
a=np.arange(12).reshape(3,4)
np.savetxt('int.txt',a,fmt='%d',delimiter=',')
np.loadtxt('int.txt',dtype=int,delimiter=',')# array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])
注意
复杂文本文件,可尝试:np.genfromtxt;使用Python的I/O函数和例如regexp进行解析(Python非常适合这个)
genfromtxt跟loadtxt差不多,只不过它面向的是结构化数组和缺失数据处理
提醒:#使用IPython导航文件系统
In [1]: pwd # 显示当前路径'/home/user/stuff/2011-numpy-tutorial'
In [ 2]: cd ex # '/home/user/stuff/2011-numpy-tutorial/ex'
In [3]: ls #populations.txt species.txt
===================================================================
3.磁盘读取数组-临时文件
import numpy as np
from tempfile import TemporaryFile
x = np.arange(10)
y = np.arange(12).reshape(3,4)
f = TemporaryFile()
np.savez(f, x=x, y=y)
f.seek(0)
npz_file = np.load(f)
npz_file.files #['x', 'y']
npz_file['x'] #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
npz_file['y'] #array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]]))
from io import StringIO
x = y = z = np.arange(0.0,5.0,1.0)
np.savetxt('test.out', x, delimiter=',')
np.savetxt('test.out', (x,y,z))
np.savetxt('test.out', x, fmt='%1.4e')
c = StringIO("1,0,2\n3,0,4")
x, y = np.loadtxt(c, delimiter=',', usecols=(0, 2), unpack=True)
# array([1., 3.]),array([2., 4.])
===================================================================
4.内存映像文件
# 将磁盘上的非常大的二进制数据文件当做内存中的数组进行处理的方式。
# 允许将大文件分成小段进行读写,而不是一次性将整个数组读入内存。
# memmap拥有普通数组一样的方法,能用ndarray的算法就也能用于memmap .
1)创建新的memmap:
mmap = np.memmap('mymmap ', dtype='float64' , mode='w+', shape=(1000, 1000))
# memmap([[0., 0., 0., ..., 0., 0., 0.],...,[0., 0., 0., ..., 0., 0., 0.]])
section= mmap[:5] #切片将会返回磁盘上的数据的视图
section[:]=np.random.randint(0,25,size=(5,1000))#数据金先被缓存在内存中(就像是Python的文件对象),
mmap.flush() #将缓冲区数据写入磁盘
section #memmap([[16., 3., 4., ..., 17., 17., 21.],...,[16., 11., 12., ..., 19., 19., 1.]])
mmap #memmap([[16., 3., 4., ..., 17., 17., 21.],...,[ 0., 0., 0., ..., 0., 0., 0.]])
del mmap # 某个内存映像超出作用域,被垃圾回收器回收,之前修改被写入磁盘。
2)打开存在内存映像
mmap = np.memmap('mymmap', dtype='float64', shape=(1000, 1000))#仍类型和形状
mmap #memmap([[16., 3., 4., ..., 17., 17., 21.],...,[ 0., 0., 0., ..., 0., 0., 0.]])
# 内存映像是一个存放在磁盘上的ndarray ,可用结构化dtype
======================================================================
备注:
1.函数说明
1). ndarray.tofile(fid,sep =“”,format =“%s”)文本或二进制将数组写入文件(默认)
#数据总以'C'顺序写入,与a的顺序无关;使用函数fromfile()来恢复。
参数:
fid: #打开文件对象,或文件名字符串。
sep: #str文本输出数组项之间分隔符。如果“”空写入二进制文件,相当于file.write(a.tobytes())。
format:#str输出文本文件格式字符串。首先将数组中的每个条目转换为最接近的Python类型,
# 然后使用“格式”%条目将其格式化为文本。
2). ndarray.dump(file)#将数组的pickle转储到指定的文件。该数组可以用pickle.load或numpy.load读回。
s=ndarray.dumps() #以字符串的形式返回数组的pickle。
numpy.loads(s) #会将字符串转换回数组。
3).从磁盘读取数组
fromfile #这大概是大阵列创建的最常见情况。
2.其他数组存储方式:-文件格式
2.1)标准二进制格式
HDF5: h5py
FITS: Astropy
# 无法直接读取但不易转换的格式示例是像PI这样的库支持的格式(能够读取和写入许多图像格式,如jpg,png等)。
2.2)常见的ASCII格式
# 逗号分隔值文件(CSV)。python中有CSV函数和pyab函数(matpotib的一部分)。
# 更多通用的ascii文件可以在scipy中使用io软件包读取。
2.3)自定义二进制格式
# 文件相对简单编写一个简单的I / O库用numpy fromfie()函数和.tofie()方法直接读取和写入numpy数组
2.4)说明:
HDF5: #h5py将NumPy的数组数据存储为高效且可压缩的HDF5
#格式( HDF意思是“层次化数据格式”)。你可以安全地将好几百GB甚至TB的数据存储为H DF5格式
PyTables #提供了一些用于结构化数组的高级查询功能,而且还能添加歹lj 索引以提升查询速度。
#这跟关系型数据库所提供的表索引功能非常类似。
==================================================================
3.图像
# 使用Matplotlib:
img = plt.imread('data/elephant.png')
img.shape, img.dtype # ((200, 300, 3), dtype('float32'))
plt.imshow(img) # <matplotlib.image.AxesImage object at ...>
plt.savefig('plot.png')
plt.imsave('red_elephant.png', img[:,:,0], cmap=plt.cm.gray)
这只保存了一个(RGB)通道:
plt.imshow(plt.imread('red_elephant.png'))
# <matplotlib.image.AxesImage object at ...>
其他库:
from scipy.misc import imsave
imsave('tiny_elephant.png', img[::6,::6])
plt.imshow(plt.imread('tiny_elephant.png'), interpolation='nearest')
# <matplotlib.image.AxesImage object at ...>
==================================================================
No | 函数 | 说明 |
1 | np.save(file, arr, allow_pickle=True) | 二进制写 |
2 | np.savez(file, *args, **kwds) | 二进制数组压缩写 |
3 | np.load(file, arr, allow_pickle=True) | 二进制读 |
4 | np.loadtxt(fname, dtype=float, delimiter=',') | 文本文件读 |
5 | np.genfromtxt() | 复杂文本读;面向结构化数组和缺失数据处理 |
6 | np.savetxt('int.txt',a,fmt='%d',delimiter=',') | 文本文件写 |
7 | m=np.memmap(file, dtype='float64' , mode='w+', shape) | 创建内存映像文件 |
8 | m.flush() | 内存映像文件写入磁盘 |
9 | np.tofile(file,sep ='',format =''%s'') | 文本或二进制将数组写入文件 |
10 | np.fromfile(file, dtype=float, count=-1, sep='') | 文本或二进制将数组读;大阵列创建的最常见情况 |
11 | np.dump(file) | 将数组的pickle转储到指定的文件。 |
12 | pickle.load或np.load | 读回pickle转储的数组 |