赵走x博客
网站访问量:151577
首页
书籍
软件
工具
古诗词
搜索
登录
Python与数据挖掘:16、Bokeh
Python与数据挖掘:15、Matplotlib
Python与数据挖掘:14、scikit-learn
Python与数据挖掘:13、Scipy
Python与数据挖掘:12、Pandas
Python与数据挖掘:11、numpy
Python与数据挖掘:10、Python实用模块介绍
Python与数据挖掘:9、面向对象编程
Python与数据挖掘:8、函数
Python与数据挖掘:7、Python基础入门---文件的读写
Python与数据挖掘:6、Python基础入门---数据结构
Python与数据挖掘:5、Python基础入门---流程控制
Python与数据挖掘:4、Python基础入门---数字数据
Python与数据挖掘:3、Python基础入门---常用操作符
Python与数据挖掘:2、Python开发环境的搭建
Python与数据挖掘:1、数据挖掘概述
Python与数据挖掘:11、numpy
资源编号:75862
书籍
Python 与数据挖掘
热度:91
NumPy是一个Python科学计算的基础模块。NumPy不但能够完成科学计算的任务,也能够被用作有效的多维数据容器,用于存储和处理大型矩阵。NumPy的数据容器能够保存任意类型的数据,这使得NumPy可以无缝并快速地整合各种数据。在性能上NumPy比起Python自身的嵌套列表结构要高效得多。Python在科学计算的其他模块大多数都是在NumPy的基础上编写的。
NumPy是一个Python科学计算的基础模块。NumPy不但能够完成科学计算的任务,也能够被用作有效的多维数据容器,用于存储和处理大型矩阵。NumPy的数据容器能够保存任意类型的数据,这使得NumPy可以无缝并快速地整合各种数据。在性能上NumPy比起Python自身的嵌套列表结构要高效得多。Python在科学计算的其他模块大多数都是在NumPy的基础上编写的。 # 1.创建数组 NumPy有多种方法去创建数组,例如通过元组和列表。下面代码是NumPy创建数组的一个实例。 ``` # 导入模块 import numpy as np print("创建数组") # 通过列表创建数组 arr1 = np.array([2, 3, 4]) # 通过元祖创建数组 arr2 = np.array([(1.3, 9, 2.0), (7, 6, 1)]) # 通过元祖(2,3)生成零矩阵(矩阵也是数组的一种) arr3 = np.zeros((2, 3)) # 生成3维的单位矩阵 arr4 = np.identity(3) # 生成每个元素都在[0,1]之间的随机矩阵 arr5 = np.random.random(size=(2, 3)) print(arr1) print('*' * 30) print(arr2) print('*' * 30) print(arr3) print('*' * 30) print(arr4) print('*' * 30) print(arr5) ``` 结果为: ``` 创建数组 [2 3 4] ****************************** [[1.3 9. 2. ] [7. 6. 1. ]] ****************************** [[0. 0. 0.] [0. 0. 0.]] ****************************** [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ****************************** [[0.23309109 0.15595228 0.81417573] [0.80993438 0.6370384 0.2661391 ]] ``` # 2.访问数组 创建数组后,NumPy有很多方法接口去访问数组的属性。在科学计算时,我们需要频繁访问数组元素,通过NumPy索引、切片和迭代器方法能够快速灵活地访问数组,如代码清单所示。 ``` # 查看数组的属性 print('返回矩阵的规格:') print(arr2.shape) print('返回矩阵的行:') print(arr2.ndim) print('返回矩阵元素总数:') print(arr2.size) print('返回矩阵元素的数据类型:') print(arr2.dtype.name) print('查看整个数组对象的类型:') print(type(arr2)) print('通过索引和切片访问数组元素:') def f(x, y): return 10 * x + y arr8 = np.fromfunction(f, (4, 3), dtype=int) print(arr8) print('返回矩阵第1行,第2列的元素(注意下标从0开始):' ) print(arr8[1,2]) print('切片,返回矩阵前2行:') print(arr8[0:2,:]) print('切片,返回矩阵第1列:') print(arr8[:,1]) print('切片,返回矩阵最后一行:') print(arr8[-1]) print('通过迭代器访问数组元素:') for row in arr8: print(row) print('输出全部矩阵元素:') for element in arr8.flat: print(element) ``` 运行结果: ``` 返回矩阵的规格: (2, 3) 返回矩阵的行: 2 返回矩阵元素总数: 6 返回矩阵元素的数据类型: float64 查看整个数组对象的类型:
通过索引和切片访问数组元素: [[ 0 1 2] [10 11 12] [20 21 22] [30 31 32]] 返回矩阵第1行,第2列的元素(注意下标从0开始): 12 切片,返回矩阵前2行: [[ 0 1 2] [10 11 12]] 切片,返回矩阵第1列: [ 1 11 21 31] 切片,返回矩阵最后一行: [30 31 32] 通过迭代器访问数组元素: [0 1 2] [10 11 12] [20 21 22] [30 31 32] 输出全部矩阵元素: 0 1 2 10 11 12 20 21 22 30 31 32 ``` # 3.数组的运算 NumPy的运算是相当方便高效的,其运算符都是针对整个数组,比起使用for循环,使用NumPy的运算方法在速度上要优秀得多,如代码清单所示。如果NumPy数组是一个矩阵,还支持矩阵求逆、转置等操作。 ``` print('数组的运算') arr9=np.array([[2,1],[1,2]]) arr10=np.array([[1,2],[3,4]]) print(arr9-arr10) print('*'*30) print(arr9**2) print('*'*30) print(3*arr10) print('普通乘法:') print(arr9*arr10) print("矩阵乘法:") print(np.dot(arr9,arr10)) print("转置:") print(arr10.T) print("返回逆矩阵:") print(np.linalg.inv(arr10)) print('数组元素求和:') print(arr10.sum()) print('返回数组最大元素:') print(arr10.max()) print("按行累计总和:") print(arr10.cumsum(axis=1)) ``` 运行结果: ``` 数组的运算 [[ 1 -1] [-2 -2]] ****************************** [[4 1] [1 4]] ****************************** [[ 3 6] [ 9 12]] 普通乘法: [[2 2] [3 8]] 矩阵乘法: [[ 5 8] [ 7 10]] 转置: [[1 3] [2 4]] 返回逆矩阵: [[-2. 1. ] [ 1.5 -0.5]] 数组元素求和: 10 返回数组最大元素: 4 按行累计总和: [[1 3] [3 7]] ``` # 4.NumPy通用函数 许多数学上的函数,如sin、cos等在NumPy都有重新的实现。在NumPy中,这些函数称为通用函数(Universal Functions)。通用函数是针对整个NumPy数组的,因此我们不需要对数组的每一个元素都进行一次操作,它们都是以NumPy数组作为输出的,如代码清单所示: ``` print('numpy 通用函数') print("指数函数:") print(np.exp(arr9)) print("正弦函数(弧度制)") print(np.sin(arr9)) print("开方函数:") print(np.sqrt(arr9)) print("和arr9+arr10效果一样:") print(np.add(arr9,arr10)) ``` 运行结果: ``` numpy 通用函数 指数函数: [[7.3890561 2.71828183] [2.71828183 7.3890561 ]] 正弦函数(弧度制) [[0.90929743 0.84147098] [0.84147098 0.90929743]] 开方函数: [[1.41421356 1. ] [1. 1.41421356]] 和arr9+arr10效果一样: [[3 3] [4 6]] ``` # 5.数组的合并和分割 下面介绍如何通过方法接口对数组进行合并和分割,如代码清单所示: ``` print("数组合并与分割:") #合并 print("纵向合并数组,由于与堆栈类似,故命名为vstack:") arr11=np.vstack((arr9,arr10)) print(arr11) print("横向合并数组:") arr12=np.hstack((arr9,arr10)) print(arr12) print("将数组纵向分为两部分:") print(np.hsplit(arr12,2)) print("将数组纵向分为两部分:") print(np.vsplit(arr11,2)) ``` 结果: ``` 数组合并与分割: 纵向合并数组,由于与堆栈类似,故命名为vstack: [[2 1] [1 2] [1 2] [3 4]] 横向合并数组: [[2 1 1 2] [1 2 3 4]] 将数组纵向分为两部分: [array([[2, 1], [1, 2]]), array([[1, 2], [3, 4]])] 将数组纵向分为两部分: [array([[2, 1], [1, 2]]), array([[1, 2], [3, 4]])] ``` 由于篇幅所限,上面未能将NumPy的所有方法逐一介绍,以下附一张NumPy上面未涉及但却常用的方法清单,如表5-1所示,方便读者更好地了解NumPy的功能。  表5-1 其他NumPy常用方法