在经常性读取大量的数值文件时(比如深度学习训练数据),可以考虑现将数据存储为Numpy格式,然后直接使用Numpy去读取,速度相比为转化前快很多.

下面就常用的保存数据到二进制文件和保存数据到文本文件进行介绍:

1.保存为二进制文件(.npy/.npz)

numpy.save

保存一个数组到一个二进制的文件中,保存格式是.npy

参数介绍

numpy.save(file, arr, allow_pickle=True, fix_imports=True)

file:文件名/文件路径

arr:要存储的数组

allow_pickle:布尔值,允许使用Python pickles保存对象数组(可选参数,默认即可)

fix_imports:为了方便Pyhton2中读取Python3保存的数据(可选参数,默认即可)

使用

>>> import numpy as np
#生成数据
>>> x=np.arange(10)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) #数据保存
>>> np.save('save_x',x) #读取保存的数据
>>> np.load('save_x.npy')
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

numpy.savez

这个同样是保存数组到一个二进制的文件中,但是厉害的是,它可以保存多个数组到同一个文件中,保存格式是.npz,它其实就是多个前面np.save的保存的npy,再通过打包(未压缩)的方式把这些文件归到一个文件上,不行你去解压npz文件就知道了,里面是就是自己保存的多个npy.

参数介绍

numpy.savez(file, *args, **kwds)

file:文件名/文件路径

*args:要存储的数组,可以写多个,如果没有给数组指定Key,Numpy将默认从'arr_0','arr_1'的方式命名

kwds:(可选参数,默认即可)

使用

>>> import numpy as np
#生成数据
>>> x=np.arange(10)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> y=np.sin(x)
>>> y
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849]) #数据保存
>>> np.save('save_xy',x,y) #读取保存的数据
>>> npzfile=np.load('save_xy.npz')
>>> npzfile #是一个对象,无法读取
<numpy.lib.npyio.NpzFile object at 0x7f63ce4c8860> #按照组数默认的key进行访问
>>> npzfile['arr_0']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> npzfile['arr_1']
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])

更加神奇的是,你可以不适用Numpy默认给数组的Key,而是自己给数组有意义的Key,这样就可以不用去猜测自己加载数据是否是自己需要的.

#数据保存
>>> np.savez('newsave_xy',x=x,y=y) #读取保存的数据
>>> npzfile=np.load('newsave_xy.npz') #按照保存时设定组数key进行访问
>>> npzfile['x']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> npzfile['y']
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])

简直不能太爽,深度学习中,有时候你保存了训练集,验证集,测试集,还包括他们的标签,用这个方式存储起来,要啥加载啥,文件数量大大减少,也不会到处改文件名去.

numpy.savez_compressed

这个就是在前面numpy.savez的基础上加了压缩,前面我介绍时尤其注明numpy.savez是得到的文件打包,不压缩的.这个文件就是对文件进行打包时使用了压缩,可以理解为压缩前各npy的文件大小不变,使用该函数比前面的numpy.savez得到的npz文件更小.

注:函数所需参数和numpy.savez一致,用法完成一样.

2.保存到文本文件

numpy.savetxt

保存数组到文本文件上,可以直接打开查看文件里面的内容.

参数介绍

numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)

fname:文件名/文件路径,如果文件后缀是.gz,文件将被自动保存为.gzip格式,np.loadtxt可以识别该格式

X:要存储的1D或2D数组

fmt:控制数据存储的格式

delimiter:数据列之间的分隔符

newline:数据行之间的分隔符

header:文件头步写入的字符串

footer:文件底部写入的字符串

comments:文件头部或者尾部字符串的开头字符,默认是'#'

encoding:使用默认参数

使用

>>> import numpy as np
#生成数据
>>> x = y = z = np.ones((2,3))
>>> x
array([[1., 1., 1.],
[1., 1., 1.]]) #保存数据
np.savetxt('test.out', x)
np.savetxt('test1.out', x,fmt='%1.4e')
np.savetxt('test2.out', x, delimiter=',')
np.savetxt('test3.out', x,newline='a')
np.savetxt('test4.out', x,delimiter=',',newline='a')
np.savetxt('test5.out', x,delimiter=',',header='abc')
np.savetxt('test6.out', x,delimiter=',',footer='abc')

保存下来的文件都是友好的,可以直接打开看看有什么变化.

numpy.loadtxt

根据前面定制的保存格式,相应的加载数据的函数也得变化.

参数介绍

numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes')

fname:文件名/文件路径,如果文件后缀是.gz或.bz2,文件将被解压,然后再载入

dtype:要读取的数据类型

comments:文件头部或者尾部字符串的开头字符,用于识别头部,尾部字符串

delimiter:划分读取上来值的字符串

converters:数据行之间的分隔符

.......后面不常用的就不写了

使用

np.loadtxt('test.out')
np.loadtxt('test2.out', delimiter=',')

Python Numpy中数据的常用的保存与读取方法的更多相关文章

  1. Numpy中数据的常用的保存与读取方法

    小书匠 深度学习  文章目录: 1.保存为二进制文件(.npy/.npz) numpy.save numpy.savez numpy.savez_compressed 2.保存到文本文件 numpy. ...

  2. Numpy中数据的常用的保存与读取

    保存到文本文件numpy.savetxt()numpy.loadtxt() import numpy as np x= np.arange(0,10,0.1) np.savetxt('save_x', ...

  3. Python/Numpy大数据编程经验

    Python/Numpy大数据编程经验 1.边处理边保存数据,不要处理完了一次性保存.不然程序跑了几小时甚至几天后挂了,就啥也没有了.即使部分结果不能实用,也可以分析程序流程的问题或者数据的特点.   ...

  4. 在python&numpy中切片(slice)

     在python&numpy中切片(slice) 上文说到了,词频的统计在数据挖掘中使用的频率很高,而切片的操作同样是如此.在从文本文件或数据库中读取数据后,需要对数据进行预处理的操作.此时就 ...

  5. JavaScript中,有三种常用的绑定事件的方法

    要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的 ...

  6. Python numpy 中常用的数据运算

    Numpy 精通面向数组编程和思维方式是成为Python科学计算大牛的一大关键步骤.——<利用Python进行数据分析> Numpy(Numerical Python)是Python科学计 ...

  7. Python numpy中矩阵的用法总结

    关于Python Numpy库基础知识请参考博文:https://www.cnblogs.com/wj-1314/p/9722794.html Python矩阵的基本用法 mat()函数将目标数据的类 ...

  8. python numpy中sum()时出现负值

    import numpy a=numpy.random.randint(1, 4095, (5000,5000)) a.sum() 结果为负值, 这是错误的,a.sum()的类型为 int32,如何做 ...

  9. Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

随机推荐

  1. Python抽象基类之声明协议

    抽象基类之--声明协议 上回讲了Python中抽象基类的大概,相信大家对abcmeta以及什么是抽象基类已经有所了解.传送门 现在我们来讲讲抽象基类的另一个常用用法--声明协议 所谓声明协议,有点像J ...

  2. 使用Linux系统,是一种什么体验?

    导读 同事,从事嵌入式软件开发多年,主要开发环境用的就是linux,最疯狂的一段时间直接把系统装成linux系统,然后在linux下面虚拟一个windows操作系统,主要有些事情必须在windows才 ...

  3. 51nod 1191:消灭兔子 贪心+优先队列

    1191 消灭兔子 题目来源: 2013腾讯马拉松赛第三场 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有N只兔子,每只有一个血量B[i],需要 ...

  4. POJ 1284:Primitive Roots 求原根的数量

    Primitive Roots Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3381   Accepted: 1980 D ...

  5. html通配符

    ♠ ♠ ♠ 黑桃 ♣ ♣ ♣ 梅花 ♥ ♥ ♥ 红桃,心 ♦ ♦ ♦ 方块牌 ◊ ◊ ◊ 菱形 † † † 匕首 ‡ ‡ ‡ 双剑号 ¡ ¡ ¡ 反向感叹号 ¿ ¿ ¿ 反向问号 ← ← ← 左箭头 ...

  6. Spring的数据源配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. Arduino -- variables

    Arduino data types and constants. Constants Floating Point Constants Integer Constants HIGH | LOW IN ...

  8. comm

    comm [- 123 ] file1 file2 说明:该命令是对两个已经排好序的文件进行比较.其中file1和file2是已排序的文件.comm读取这两个文件,然后生成三列输出:仅在file1中出 ...

  9. 美素数(HDU 4548)(打表,简化时间复杂度)

    相信大家都喜欢美的东西,让我们一起来看看美素数吧. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数",如29,本身是素数,而且2+9 = 11 ...

  10. C 的printf函数

    头文件 #include <stdio.h> printf函数是最常用的格式化输出函数,原型为:int printf(char *format,......); printf函数会根据参数 ...