当前位置 : 主页 > 编程语言 > java >

numpy中的文件读写

来源:互联网 收集:自由互联 发布时间:2022-06-23
在实际开发中,我们需要从文件中读取数据,并进行处理。在numpy中,提供了一系列函数从文件中读取内容并生成矩阵,常用的函数有以下两个 1. loadtxt loadtxt适合处理数据量较小的文件

在实际开发中,我们需要从文件中读取数据,并进行处理。在numpy中,提供了一系列函数从文件中读取内容并生成矩阵,常用的函数有以下两个

1. loadtxt

loadtxt适合处理数据量较小的文件,基本用法如下

>>> import numpy as np
>>> np.loadtxt('a.txt')
array([[ 1., 2.],
[ 3., 4.]])

默认采用空白作为分隔符,将文件中的内容读取进来,并生成矩阵,要求每行的内容数目必须一致,也就是说不能有缺失值。由于numpy矩阵中都是同一类型的元素,所以函数会自动将文件中的内容转换为同一类型。

如果文件内容全为纯数字或者字符,上述行为当然没什么问题,但是当文件内容是混合型时,有可能出现无法自动转换的情况,最常见的第一行为字符串表头,其他行为数字,此时程序会尝试将表头的字符串转换为浮点型,由于无法自动转换,程序就会报错,示意如下

>>> np.loadtxt('a.txt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/numpy/lib/npyio.py", line 930, in loadtxt
items = [conv(val) for (conv, val) in zip(converters, vals)]
File "/usr/lib/python3/dist-packages/numpy/lib/npyio.py", line 930, in <listcomp>
items = [conv(val) for (conv, val) in zip(converters, vals)]
File "/usr/lib/python3/dist-packages/numpy/lib/npyio.py", line 659, in floatconv
return float(x)
ValueError: could not convert string to float: b'name'

为此,我们可以跳过第一行,用法如下

>>> np.loadtxt('a.txt', skiprows = 1)
array([[ 1., 2.],
[ 3., 4.]])

除此之外,该函数还提供了很多的参数,常用的有以下几个

# 修改分隔符
>>> np.loadtxt('a.txt', delimiter='\t')
array([[ 1., 2.],
[ 3., 4.]])
# 设置注释的标识符,默认#号
# 包含注释符的行会被跳过
>>> np.loadtxt('a.txt', comments = '#')
array([[ 1., 2.],
[ 3., 4.]])
# 选择对应的列,下标从0开始
>>> np.loadtxt('a.txt', usecols = (1, ))
array([ 2., 4.])
# 每一列返回一个矩阵
>>> x, y = np.loadtxt('a.txt', unpack = True)
>>> x
array([ 1., 3.])
>>> y
array([ 2., 4.])

loadtxt更多的用于处理savetxt保存的numpy矩阵,用法如下

>>> a = np.arange(4).reshape(2, 2)
>>> a
array([[0, 1],
[2, 3]])
# 存储数据到文件
>>> np.savetxt('test.txt',a)
# 从文件中读取数组
>>> a = np.loadtxt('test.txt')
>>> a
array([[ 0., 1.],
[ 2., 3.]])

2. genfromtxt

对于数据量大的文件,推荐使用genfromtxt函数,用法和loadtxt类似,但是速度更快,最重要的是,该函数会自动处理缺失值,常用参数用法示意如下

# 修改分隔符
>>> np.genfromtxt('a.txt', delimiter = '\t')
array([[ 1., 2.],
[ 3., 4.]])
# 设置注释的标识符,默认#号
# 包含注释符的行和空行会被跳过
>>> np.genfromtxt('a.txt', comments = '#')
array([[ 1., 2.],
[ 3., 4.]])
# 跳过开头的行,0表示不跳过
>>> np.genfromtxt('a.txt', skip_header = 0)
array([[ 1., 2.],
[ 3., 4.]])
# 选择对应的列,下标从0开始
>>> np.genfromtxt('a.txt', usecols = (1,))
array([ 2., 4.])

重点来看下其缺失值处理功能,对于文件中无法转换为同一类型的内容,自动用np.nan来表示,同时也可以自定义缺失值,并指定缺失值的填充方式,示意如下

# 自动转换为nan
>>> np.genfromtxt('a.txt')
array([[ 1., 2.],
[ nan, 4.]])
# 指定缺失值对应的字符
>>> np.genfromtxt('a.txt', missing_values = 'NA')
array([[ 1., 2.],
[ nan, 4.]])
# 指定缺失值用0填充
>>> np.genfromtxt('a.txt', missing_values = 'NA', filling_values = 0)
array([[ 1., 2.],
[ 0., 4.]])

除了经典的文件读取外,numpy还支持将矩阵用二进制的文件进行存储,支持npy和npz两种格式,用法如下

# save函数将单个矩阵存储到后缀为npy的二进制文件中
>>> np.save('out.npy',a)
# savez函数将多个矩阵存储到后缀为npz的二进制文件中
>>> np.savez('out.npz',a)
# load函数直接读取npy的内容
>>> np.load('out.npy')
array([[ 0., 1.],
[ 2., 3.]])
# npz包含多个数组,默认用arr_0,arr_1的方式来访问对应的数组
>> np.load('out.npz')['arr_0']
array([[ 0., 1.],
[ 2., 3.]])

以上就是numpy文件读写的基本用法,numpy作为科学计算的底层核心包,有很多的包对其进行了封装,提供了更易于使用的借口,最出名的比如pandas,通过pandas来进行文件读写,会更加简便,在后续的文章中再进行详细介绍。

·end·


numpy中的文件读写_数据分析

一个只分享干货的

生信公众号



上一篇:numpy中生成随机数的技巧汇总
下一篇:没有了
网友评论