前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >numpy中的文件读写

numpy中的文件读写

作者头像
生信修炼手册
发布2020-06-18 17:35:07
2K0
发布2020-06-18 17:35:07
举报
文章被收录于专栏:生信修炼手册生信修炼手册

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

1. loadtxt

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

代码语言:javascript
复制
>>> import numpy as np
>>> np.loadtxt('a.txt')
array([[ 1., 2.],
       [ 3., 4.]])

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

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

代码语言:javascript
复制
>>> 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'

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

代码语言:javascript
复制
>>> np.loadtxt('a.txt', skiprows = 1)
array([[ 1., 2.],
       [ 3., 4.]])

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

代码语言:javascript
复制
# 修改分隔符
>>> 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矩阵,用法如下

代码语言:javascript
复制
>>> 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类似,但是速度更快,最重要的是,该函数会自动处理缺失值,常用参数用法示意如下

代码语言:javascript
复制
# 修改分隔符
>>> 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来表示,同时也可以自定义缺失值,并指定缺失值的填充方式,示意如下

代码语言:javascript
复制
# 自动转换为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两种格式,用法如下

代码语言:javascript
复制
# 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来进行文件读写,会更加简便,在后续的文章中再进行详细介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信修炼手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档