详细介绍 Numpy 中 genfromtxt 函数用法

关注公众号:【小张Python】,为你准备了 50+ 本Python 精品电子书籍 与 50G + 优质视频学习资料,后台回复关键字:1024 即可获取;如果对博文内容有什么疑问,公众号后台添加作者【个人微信】,可与作者直接进行交流

Numpy 中导入数据方式有多种,其中函数之一为 genfromtxt ,genformtxt 相对其他函数有自己的优势和劣势,

  • 劣势:相对其它函数数据加载慢,从数据读入到返回需要两个迭代循环,第一个迭代将文件中每一行转化为一个字符串序列,第二个循环迭代对每个字符串序列指定合适的数据类型;源于这两个迭代原因,相对其它函数会慢一点;
  • 优势:更灵活,数据加载时会能够处理丢失数据,例如对某些 missing_values 做一些数据填充,或将某一列数据从一中形式转化为另一种形式;

函数语法如下:

genfromtxt(fname,dtype,comments,delimiter,skipd_header,skip_fonter,converters,missing_values,filling_values,usecols,names, autostrip,**kwarg)

  • fname -> str/list /IO Object 等等,表示数据源;文件路径,字符串列表、StringIO 对象都可;

  • dtype -> dtype,最终数组的数据类型;

  • comments -> str,注释标识符,加载时会自动忽略位于注释标识符后面的字符串;

  • delimiter -> str/int/sequence,分割符,加载时来分割字符串,比较常见的就是逗号,也可以指定 int 整形表示每一个元素最大宽度;也可以是字符列表,表示分割符可为多个字符;

  • skip_header -> int,数据加载时跳过文件头部的字符行数;

  • skip_footer -> int,数据加载时跳过文件尾部字符串行数;

  • converters -> variable,可以是字典形式也可以是 lambda 函数,表示将某一种数据格式转化为另一种数据格式;

  • missing_values -> variable,指定数组中 missing value;

  • filling_values -> variable,指定 filling_values,来替代 missing_value;

  • usercols -> sequence,指定需读取的列数, 0 表示第一列,-1 为最后一列;

上面列举出各参数基本用法后,下面将针对里面每个参数,结合实例详细介绍其用法

fname 参数

入的 fname 是以 gz 结尾的话,读取时会在加载数据之前自动解压,但较为常见的都是 txt 文本

delimiter参数

当 delimiter 为字符时,表示分割符,元素以分割符进行分割

>>> data = u"1, 2, 3\n4, 5, 6"
>>> np.genfromtxt(StringIO(data), delimiter=",")
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

当 delimiter 表示整数元组时,代表每一列所在元素最大宽度;如下定义了每一列元素最大宽度分别为4,3,2;

>>> data = u"  1  2  3\n  4  5 67\n890123  4"
>>> np.genfromtxt(StringIO(data), delimiter=3)
array([[   1.,    2.,    3.],
       [   4.,    5.,   67.],
       [ 890.,  123.,    4.]])
>>> data = u"123456789\n   4  7 9\n   4567 9"
>>> np.genfromtxt(StringIO(data), delimiter=(4, 3, 2))
array([[ 1234.,   567.,    89.],
       [    4.,     7.,     9.],
       [    4.,   567.,     9.]])

autostrip 参数

对于每行字符串用 分割符分割后,得到的单个元素可能会含有一些制表符或空格等标识符;autostrip 参数设为 True,元素中的空格标识符会被自动删除~

>>> data = u"1, abc , 2\n 3, xxx, 4"
>>> # Without autostrip
>>> np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5")
array([['1', ' abc ', ' 2'],
       ['3', ' xxx', ' 4']], dtype='<U5')
>>> # With autostrip
>>> np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5", autostrip=True)
array([['1', 'abc', '2'],
       ['3', 'xxx', '4']], dtype='<U5')

comments 参数

comments表示注释标识符,指定后注释标识符所在行后面的字符会被自动省略,如下:

>>> data = u"""#
... # Skip me !
... # Skip me too !
... 1, 2
... 3, 4
... 5, 6 #This is the third line of the data
... 7, 8
... # And here comes the last line
... 9, 0
... """
>>> np.genfromtxt(StringIO(data), comments="#", delimiter=",")
array([[1., 2.],
       [3., 4.],
       [5., 6.],
       [7., 8.],
       [9., 0.]])

skip_header,skip_footer

读取数据时,可能前几行后者后几行的数据我们不需要,此时设定 skip_header、skip_footer 参数即可,例如读取时 想过滤数据列表中 前三行、后五行数据,此时参数设定时 skip_header=3,skip_footer=5 即可

>>> data = u"\n".join(str(i) for i in range(10))
>>> np.genfromtxt(StringIO(data),)
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])
>>> np.genfromtxt(StringIO(data),
...               skip_header=3, skip_footer=5)
array([ 3.,  4.])

usecols

usecols 参数来指定只读取数据中指定的列,与数组索引用法相似,下面是只提取原数据中第一列和最后一列数据:

>>> data = u"1 2 3\n4 5 6"
>>> np.genfromtxt(StringIO(data), usecols=(0, -1))
array([[ 1.,  3.],
       [ 4.,  6.]])

converters

converters 用来对数组中一些数据进行格式替换,以字典形式定义 key 表示需要数据转化的列索引,value 为转换函数,下面实例中将百分比转化为浮点型

>>> data = u"1, , 3\n 4, 5, 6"
>>> convert = lambda x: float(x.strip() or -999)
>>> np.genfromtxt(StringIO(data), delimiter=",",
...               converters={1: convert})
array([[   1., -999.,    3.],
       [   4.,    5.,    6.]])

missing_values,filling_values

读取的数据中一般出现缺失值,而这些缺失值有时对最终分析结果影响很大,我们需要做的就是将这些缺失值用某些值来代替,这里就需要用到 missing_values 、filling_values ,前者标记缺失值,后者对missing_values 进行填充 ,

例如下面的实例,分别将 0,1,2 列数据中的 ‘N/A’、空格、‘???’ 替换为 0,0,-999;

>>> data = u"N/A, 2, 3\n4, ,???"
>>> kwargs = dict(delimiter=",",
...               dtype=int,
...               names="a,b,c",
...               missing_values={0:"N/A", 'b':" ", 2:"???"},
...               filling_values={0:0, 'b':0, 2:-999})
>>> np.genfromtxt(StringIO(data), **kwargs)
array([(0, 2, 3), (4, 0, -999)],
      dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')])
<think>好的,用户现在想了解NumPy库中有哪些函数。之前已经介绍NumPy的基本用途和核心功能,现在需要更深入地列举具体函数。首先,我需要考虑用户可能的背景。他们可能刚开始学习数据科学或科学计算,需要知道常用的函数来操作数组和进行数学运算。 用户的需求是了解NumPy中的函数,但可能并不清楚具体的分类。我应该将函数按类别划分,这样更便于理解。比如基础数组操作、数学函数、统计函数、线性代数、随机数生成等,这些都是NumPy的重要部分。 需要确保每个类别下都有足够的例子,但不要过于冗长。比如在基础数组操作里,np.array(), np.zeros(), np.ones()这些创建数组的函数是必须提到的。然后数学函数部分,像np.sin(), np.exp()等,这些是常用的数学运算。 同时,用户可能对广播机制和向量化操作不太熟悉,所以需要在解释函数时提到这些特性。例如,np.add()可以自动处理不同形状的数组,这就是广播的实际应用。 还要注意用户可能需要的实际应用场景。比如数据处理中的统计函数,如np.mean()、np.std(),或者在机器学习中用到的线性代数函数,如np.dot()。这些例子能帮助用户将函数与实际用途联系起来。 另外,考虑到用户之前已经了解NumPy的基础,可以适当加入一些高级函数,如np.where()进行条件筛选,或者np.reshape()改变数组形状,这些在实际项目中很常用。 需要检查是否有遗漏的重要函数,比如随机数生成相关的np.random.rand(),或者文件操作的np.save(),这些也是用户可能会用到的功能。同时,确保每个函数都有简短的代码示例,这样用户能直观看到用法。 最后,总结一下NumPy函数库的广泛性,并鼓励用户查阅官方文档,这样他们可以根据具体需求深入学习。整体结构要清晰,分类明确,便于用户快速查找需要的函数类型。</think>NumPy 提供了 **数千个函数**,覆盖数值计算、数组操作、线性代数、统计等多个领域。以下是按功能分类的 **核心函数示例** 及其典型应用: --- ### **1. 基础数组操作** | 函数 | 功能描述 | 示例代码 | |--------------------------|-----------------------------------|-----------------------------------| | `np.array()` | 将列表/元组转换为NumPy数组 | `a = np.array([1, 2, 3])` | | `np.zeros()` | 创建全零数组 | `np.zeros((2,3))` → 2行3列零矩阵 | | `np.ones()` | 创建全1数组 | `np.ones(5)` → 长度5的全1数组 | | `np.arange()` | 生成等差序列 | `np.arange(0, 10, 2)` → [0,2,4,6,8] | | `np.linspace()` | 生成等间隔数值 | `np.linspace(0, 1, 5)` → [0, 0.25, 0.5, 0.75, 1] | | `np.reshape()` | 改变数组形状 | `arr.reshape(2, 3)` | | `np.concatenate()` | 合并数组 | `np.concatenate([a, b], axis=0)` | --- ### **2. 数学运算** | 函数 | 功能描述 | 示例代码 | |--------------------------|-----------------------------------|-----------------------------------| | `np.add()` / `+` | 加法(支持广播) | `a + b` | | `np.multiply()` / `*` | 逐元素乘法 | `a * b` | | `np.dot()` | 矩阵乘法 | `np.dot(matrix1, matrix2)` | | `np.sin()`, `np.cos()` | 三角函数 | `np.sin(np.pi/2)` → 1.0 | | `np.exp()` | 指数函数 | `np.exp(1)` → e ≈ 2.718 | | `np.log()` | 自然对数 | `np.log(np.e)` → 1.0 | | `np.sqrt()` | 平方根 | `np.sqrt(4)` → 2.0 | --- ### **3. 统计与聚合** | 函数 | 功能描述 | 示例代码 | |--------------------------|-----------------------------------|-----------------------------------| | `np.sum()` | 求和 | `np.sum(arr)` | | `np.mean()` | 计算平均值 | `np.mean(arr)` | | `np.std()` | 计算标准差 | `np.std(arr)` | | `np.max()` / `np.min()` | 最大值/最小值 | `np.max(arr)` | | `np.argmax()` | 返回最大值索引 | `np.argmax([3,1,2])` → 0 | | `np.percentile()` | 计算分位数 | `np.percentile(arr, 50)` → 中位数 | --- ### **4. 线性代数** | 函数 | 功能描述 | 示例代码 | |--------------------------|-----------------------------------|-----------------------------------| | `np.linalg.inv()` | 矩阵求逆 | `np.linalg.inv(matrix)` | | `np.linalg.det()` | 计算矩阵行列式 | `np.linalg.det(matrix)` | | `np.linalg.eig()` | 计算特征值和特征向量 | `eigenvalues, eigenvectors = np.linalg.eig(matrix)` | | `np.linalg.solve()` | 解线性方程组 Ax = b | `x = np.linalg.solve(A, b)` | --- ### **5. 随机数生成** | 函数 | 功能描述 | 示例代码 | |--------------------------|-----------------------------------|-----------------------------------| | `np.random.rand()` | 生成[0,1)均匀分布随机数 | `np.random.rand(3,2)` → 3×2随机矩阵 | | `np.random.randn()` | 生成标准正态分布随机数 | `np.random.randn(5)` → 5个随机数 | | `np.random.randint()` | 生成整数随机数 | `np.random.randint(0, 10, size=5)` → 5个0-9的整数 | --- ### **6. 逻辑与筛选** | 函数 | 功能描述 | 示例代码 | |--------------------------|-----------------------------------|-----------------------------------| | `np.where()` | 条件筛选/替换 | `np.where(arr > 0, arr, 0)` → 负数替换为0 | | `np.logical_and()` | 逻辑与操作 | `np.logical_and(arr > 2, arr < 5)` | | `np.unique()` | 去重并排序 | `np.unique([2, 1, 2, 3])` → [1,2,3] | --- ### **7. 输入输出** | 函数 | 功能描述 | 示例代码 | |--------------------------|-----------------------------------|-----------------------------------| | `np.save()` / `np.load()`| 保存/加载数组到文件 | `np.save('data.npy', arr)` | | `np.genfromtxt()` | 从文本文件读取数据 | `data = np.genfromtxt('data.csv', delimiter=',')` | --- ### **总结** NumPy函数库设计目标是 **覆盖科学计算全场景**,以上仅展示常用函数。实际使用时建议: 1. **查文档**:[NumPy官方文档](https://numpy.org/doc/stable/) 2. **按需搜索**:如“如何用NumPy计算相关系数矩阵?” → `np.corrcoef()` 3. **活用广播机制**:避免显式循环,提升代码效率!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张Python1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值