Numpy包是一个用于科学计算的第三方python包,使用Numpy包可以实现Python几乎所有的数据操作,此外有些更新的工具包(如pandas等)都是围绕NumPy数组构建的。本节将提供一些使用NumPy数组操作来访问数据和子数组,以及分割、重新塑造和连接数组的示例。 首先是调用Numpy包及查看版本 import numpy numpy.__version__ 另外常用简写命令调用 import numpy as np 一、构建数组1.1 从python列表中创建数组与python list不同,Numpy要求数组中的数据格式必须保持一致,否则将会自动转换。下面是一些例子 np.array([3.14, 4, 2, 3]) out: array([ 3.14, 4. , 2. , 3. ]) np.array([1,'2',3,4]) out: array(['1', '2', '3', '4'], dtype='<U21') 可以通过dtype定义 np.array([1, 2, 3, 4], dtype='float32') 另外,不同于python list,Numpy数组可以是多维数据。 1.1 Numpy常用命令创建数组np.zeros() 创建含0数组 np.ones() 创建 含1数组 np.full() 创建包含同样元素的数组 np.arange()及np.linspace()构建等差数列的数组 np.random.random() 、np.random.normal()、np.random.randint()创建由随机数构成数组。 NumPy标准数据类型 二、Numpy数组基础操作基础的数组操作包括:
2.1 数组常见属性
其他常见属性还包含
2.2 数组索引--访问数组元素针对多维数组 可以通过数组索引改变元素值,要注意修改后的数据属性要与原数据保持一致,否则会报错或数据自动调整至与原数组元素属性一致。 2.3 数组切片--访问子数组运行模式:x[start:stop:step] 一维数组 多维数组 直接赋值给新数组 x=y, 改变其中一个数组的元素,另一个数组也会相应进行变化。用x=y.copy(),改变一个数组元素不会引起另一个数组的变化。 2.4 数组重构数据重构可通过reshape命令实现,具体参照如下示例: 2.5 数组合并及拆分2.5.1数组合并常用函数
np.vstack()、np.hstack()、np.dstack() 2.5.2 数组拆分常用函数
如上面示例,split会依据所给的N个分割点,产生N+1个子数组。np.hsplit、np.vsplit使用方法类似,np.hsplit案列进行切割,np.vsplit暗行进行切割。 三、Numpy函数3.1 常用算数函数如下表格中列出了一些常用的算术函数 求绝对值:np.absolute() or np.abs() 求对数计算:np.log()、np.log2()、np.log10() 下文中以一些例子来说明这些函数的使用 1)指数计算 2)对数计算 3.2 三角函数3.3 总计(Aggregations)1)reduce方法 reduce方法对数组的元素进行给定的重复操作,直到得到一个结果。 上图中例子分别实现x中元素累加或累乘。 2) accumulate方法 accumulate方法与reduce方法类似,但可以保留每个中间结果。 *以上方法的替代函数: 3)其他常用统计函数 四、Numpy Broadcasting广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。如果计算中的两个数组 a 和 b 形状相同,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。如果2 个数组的形状不同时,numpy 将自动触发广播机制。下面是几个例子: 例1) 例2) 例3) 以上示例的图示原理如下: 根据以上例子,我们可以总结出Numpy 广播所遵循的规则如下:
六、Numpy 比较与布尔逻辑6.1 比较操作符第四部分中我们介绍了Numpy常用的加减计算。除了常规的算术运算外,Numpy同时还能实现比较操作,如<(小于)和>(大于)等,这些比较运算通常会得到是一个布尔数据类型的数组。 常用的6项比较操作符如下: 下面是一个二维数组运算示例 6.2 布尔数组操作6.2.1 统计布尔数组中真值
还可以按照行或列进行统计
6.2.2 布尔数组操作6.2.3 布尔数组作为掩码可以使用布尔数组作为掩码,来筛选数据本身的特定子集。masking操作返回的是一个一维数组,其中包含满足此条件的所有值,换句话说,掩码数组包含True的位置上的所有值。示例如下: 6.2.4 and /or与&/| 的区别有一个比较容易混淆的点是and和or与操作符&和|之间的区别,两类的区别在于and和or对整个对象执行一个布尔值计算,而&和|对对象的内容(单个位或字节)执行多个布尔值计算。 类似地,当对给定数组执行布尔表达式时,应该使用| 或 &而不是or或 and。 七、复杂索引(Fancy Indexing)7.1 复杂索引介绍复杂索引的概念很简单:它意味着利用索引数组来同时访问多个数组元素。花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行,如下图示例。 7.2 组合索引我们还可以将花式索引与切片结合起来使用 7.3 利用花式索引改变数值八、数组排序8.1 利用np.sort 及 np.argsort进行快速排序Numpy 数据排序常用两个函数:np.sort & np.argsort。np.sort可在不修改输入的情况下返回数组的排序结果。 如果你希望直接对数组进行排序,可以使用sort方法: 此外argsort反馈排序后的index值,如下示例: 8.2 按照行/列进行数组排序按列对数组进行排序 按行对数组进行排序 8.3 部分排序np.partition输入为数组及k(元素数目),会将最小的k个元素放在数组左侧,其余元素放在另一侧。如下示例: 参考资料: 1.Python Data Science Handbook 2.NumPy 教程 |
|