numpy文件存取

来源:互联网 发布:ps4版巫师3年度版优化 编辑:程序博客网 时间:2024/05/11 01:28

转自:http://hyry.dip.jp/tech/book/page/scipy/numpy_file.html

文件存取

NumPy提供了多种存取数组内容的文件操作函数。保存数组数据的文件可以是二进制格式或者文本格式。二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型。

使用数组对象的tofile()方法可以方便地将数组中的数据以二进制格式写进文件。tofile()输出的数据不保存数组形状和元素类型等信息。因此用fromfile()函数读回数据时需要用户指定元素类型,并对数组的形状进行适当的修改:

>>> a = np.arange(0,12)>>> a.shape = 3,4>>> aarray([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])>>> a.tofile("a.bin")>>> b = np.fromfile("a.bin", dtype=np.float) # 按照float类型读入数据>>> b # 读入的数据是错误的array([  2.12199579e-314,   6.36598737e-314,   1.06099790e-313,         1.48539705e-313,   1.90979621e-313,   2.33419537e-313])>>> a.dtype # 查看a的dtypedtype('int32')>>> b = np.fromfile("a.bin", dtype=np.int32) # 按照int32类型读入数据>>> b # 数据是一维的array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])>>> b.shape = 3, 4 # 按照a的shape修改b的shape>>> b # 这次终于正确了array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])

从上面的例子可以看出,在读入数据时需要正确设置dtype参数,并修改数组的shape属性才能得到和原始数据一致的结果。无论数据的排列顺序是C语言格式还是Fortran语言格式,tofile()都统一使用C语言格式输出。此外如果指定了sep参数,则fromfile()和tofile()将以文本格式对数组进行输入输出。sep参数指定的是文本数据中数值的分隔符。

load()和save()用NumPy专用的二进制格式保存数据,它们会自动处理元素类型和形状等信息:

>>> np.save("a.npy", a)>>> c = np.load( "a.npy" )>>> carray([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])

如果想将多个数组保存到一个文件中,可以使用savez()。savez()的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起名,非关键字参数传递的数组会自动起名为arr_0、arr_1、...。savez()输出的是一个扩展名为npz的压缩文件,其中每个文件都是一个save()保存的npy文件,文件名和数组名相同。load()自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为键获取数组的内容:

>>> a = np.array([[1,2,3],[4,5,6]])>>> b = np.arange(0, 1.0, 0.1)>>> c = np.sin(b)>>> np.savez("result.npz", a, b, sin_array = c)>>> r = np.load("result.npz")>>> r["arr_0"] # 数组aarray([[1, 2, 3],       [4, 5, 6]])>>> r["arr_1"] # 数组barray([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])>>> r["sin_array"] # 数组carray([ 0.        ,  0.09983342,  0.19866933,  0.29552021,  0.38941834,        0.47942554,  0.56464247,  0.64421769,  0.71735609,  0.78332691])

用解压软件打开“result.npz”文件,会发现其中有三个文件:“arr_0.npy”、“arr_1.npy”和“sin_array.npy”,其中分别保存着数组a、b、c的内容。

save()和savez()输出的二进制文件有特殊的格式,较难用其它语言编写的程序读入。

savetxt()和loadtxt()可以读写保存1维和2维数组的文本文件。例如可以用它们读写CSV格式的文本文件:

>>> a = np.arange(0,12,0.5).reshape(4,-1)>>> np.savetxt("a.txt", a) # 缺省按照'%.18e'格式保存数值,以空格分隔>>> np.loadtxt("a.txt")array([[  0. ,   0.5,   1. ,   1.5,   2. ,   2.5],       [  3. ,   3.5,   4. ,   4.5,   5. ,   5.5],       [  6. ,   6.5,   7. ,   7.5,   8. ,   8.5],       [  9. ,   9.5,  10. ,  10.5,  11. ,  11.5]])>>> np.savetxt("a.txt", a, fmt="%d", delimiter=",") #改为保存为整数,以逗号分隔>>> np.loadtxt("a.txt",delimiter=",") # 读入的时候也需要指定逗号分隔array([[  0.,   0.,   1.,   1.,   2.,   2.],       [  3.,   3.,   4.,   4.,   5.,   5.],       [  6.,   6.,   7.,   7.,   8.,   8.],       [  9.,   9.,  10.,  10.,  11.,  11.]])

有的CSV文件中除了保存数值之外,还保存一些说明文字,例如第一行和第一列通常为列名和行名。如果需要忽略CSV文件的第一行和第一列,可以先将文件读为字符串数组,然后取出需要的部分再转换为数值数组。例如对于下面的CSV数据文件:

姓名,年龄,体重,身高张三,30,75,165李四,45,60,170王五,15,30,120

可以采用如下的程序读入其中的数值部分:

02-numpy/numpy_read_csv.py

读取CSV文件

>>> tmp = np.loadtxt("test.csv", dtype=np.str, delimiter=",")>>> data = tmp[1:,1:].astype(np.float)>>> dataarray([[  30.,   75.,  165.],       [  45.,   60.,  170.],       [  15.,   30.,  120.]])

此外,使用结构数组也能读入这样的文件,并且可以使用不同的元素类型保存每个列的值,下面先定义结构数组的类型:

>>> persontype = np.dtype({...     'names':['name', 'age', 'weight', 'height'],...     'formats':['S32','i', 'f', 'f']})

由于文件中的第一行不是数据,因此需要先打开数据文件,读取完第一行之后,再把文件对象传递给loadtxt():

>>> f = file("test.csv")>>> f.readline()>>> data = np.loadtxt(f, delimiter=",", dtype=persontype)>>> print data[('\xe5\xbc\xa0\xe4\xb8\x89', 30, 75.0, 165.0) ('\xe6\x9d\x8e\xe5\x9b\x9b', 45, 60.0, 170.0) ('\xe7\x8e\x8b\xe4\xba\x94', 15, 30.0, 120.0)]

实际上,前面介绍的所有读写文件的函数都可以直接使用已经打开的文件对象,如果使用文件对象,可以将多个数组储存到一个npy文件中:

>>> a = np.arange(8)>>> b = np.add.accumulate(a)>>> c = a + b>>> f = file("result.npy", "wb")>>> np.save(f, a) # 顺序将a,b,c保存进文件对象f>>> np.save(f, b)>>> np.save(f, c)>>> f.close()>>> f = file("result.npy", "rb")>>> np.load(f) # 顺序从文件对象f中读取内容array([0, 1, 2, 3, 4, 5, 6, 7])>>> np.load(f)array([ 0,  1,  3,  6, 10, 15, 21, 28])>>> np.load(f)array([ 0,  2,  5,  9, 14, 20, 27, 35])
转自:
http://www.it165.net/pro/html/201406/15606.html

上一篇中我们简要带过了Numpy的数据持久化,在这一篇中将要具体说明Numpy提供的文件存取功能。Numpy可以将数组保存至二进制文件、文本文件,同时支持将多个数组保存至一个文件中。

1. np.tofile() & np.fromfile()

view sourceprint?
01.import numpy as np
02.import os
03. 
04.os.chdir("d:\\")
05.a = np.arange(0,12)
06.a.reshape(3,4)
07.array([[ 0,  1,  2,  3],
08.4,  5,  6,  7],
09.8,  91011]])
10. 
11.a.tofile("a.bin")                                    #保存至a.bin
12. 
13.b = np.fromfile("a.bin", dtype=np.int32)  #从文件中加载数组,错误的dtype会导致错误的结果
14.array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011])
15. 
16.b.reshape(3,4)
17.array([[ 0,  1,  2,  3],
18.4,  5,  6,  7],
19.8,  91011]])
20.#读取的数据将为一维数组,需要使用reshape改变其数组结构

2. np.save() & np.load() & np.savez()

load()和save()用Numpy专用的二进制格式保存数据,它们会自动处理元素类型和形状等信息。savez()提供了将多个数组存储至一个文件的能力,调用load()方法返回的对象,可以使用数组名对各个数组进行读取。默认数组名arr_0,arr_1,arr_2......

view sourceprint?
1.np.save("a.npy", a.reshape(3,4))
2.c = np.load("a.npy")
3.c
4.array([[ 0,  1,  2,  3],
5.4,  5,  6,  7],
6.8,  91011]])

多个数组存储至一个文件:

view sourceprint?
01.a = np.array([[1,2,3],[4,5,6]])
02.b = np.arange(0,1.0,0.1)
03.c = np.sin(b)
04.np.savez("result.npz", a, b, sin_arr=c)  #使用sin_arr命名数组c
05.r = np.load("result.npz") #加载一次即可
06.r["arr_0"]
07.array([[123],
08.[456]])
09.r["arr_1"]
10.array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])
11.r["sin_arr"]
12.array([ 0.        ,  0.09983342,  0.19866933,  0.29552021,  0.38941834,
13.0.47942554,  0.56464247,  0.64421769,  0.71735609,  0.78332691])

 可以使用解压软件解压缩.npz文件会得到存储的各个数组对应的.npy文件以便进行遍历。

3. savetxt() & loadtxt()

view sourceprint?
01.a = np.arange(0,12,0.5).reshape(4,-1)
02.a
03.array([[  0. ,   0.5,   1. ,   1.5,   2. ,   2.5],
04.[  3. ,   3.5,   4. ,   4.5,   5. ,   5.5],
05.[  6. ,   6.5,   7. ,   7.5,   8. ,   8.5],
06.[  9. ,   9.5,  10. ,  10.5,  11. ,  11.5]])
07.np.savetxt("a.txt", a)
08.np.loadtxt("a.txt")
09.array([[  0. ,   0.5,   1. ,   1.5,   2. ,   2.5],
10.[  3. ,   3.5,   4. ,   4.5,   5. ,   5.5],
11.[  6. ,   6.5,   7. ,   7.5,   8. ,   8.5],
12.[  9. ,   9.5,  10. ,  10.5,  11. ,  11.5]])
13.np.savetxt("a.txt", a, fmt="%d", delimiter=",") #指定存储数据类型为整型,分隔符为,
14.np.loadtxt("a.txt", delimiter=',') #以,分隔符读取
15.array([[  0.,   0.,   1.,   1.,   2.,   2.],
16.[  3.,   3.,   4.,   4.,   5.,   5.],
17.[  6.,   6.,   7.,   7.,   8.,   8.],
18.[  9.,   9.,  10.,  10.,  11.,  11.]])
0 0
原创粉丝点击