5.2 NumPy
NumPy是一个Python科学计算的基础模块。NumPy不但能够完成科学计算的任务,也能够被用作有效的多维数据容器,用于存储和处理大型矩阵。NumPy的数据容器能够保存任意类型的数据,这使得NumPy可以无缝并快速地整合各种数据。在性能上NumPy比起Python自身的嵌套列表结构要高效得多。Python在科学计算的其他模块大多数都是在NumPy的基础上编写的。
1.创建数组
NumPy有多种方法去创建数组,例如通过元组和列表。代码清单5-1是NumPy创建数组的一个实例。
代码清单5-1 NumPy创建数组
import NumPy as np #导入模块 print '''创建数组 ''' arr1 = np.array([2,3,4]) # 通过列表创建数组 arr2 = np.array([(1.3,9,2.0),(7,6,1)]) # 通过元组创建数组 arr3 = np.zeros((2,3)) # 通过元组 (2,3)生成零矩阵 (矩阵也是数组的一种 ) arr4 = np.identity(3) # 生成 3维的单位矩阵 arr5 = np.random.random(size = (2,3)) # 生成每个元素都在 [0,1]之间的随机矩阵 print arr1 # result: # [2 3 4] print arr2 # result: # [[ 1.3 9. 2. ] # [ 7. 6. 1. ]] print arr3 # result: # [[ 0. 0. 0.] # [ 0. 0. 0.]] print arr4 # result: # [[ 1. 0. 0.] # [ 0. 1. 0.] # [ 0. 0. 1.]] print arr5 # result: # [[ 0.31654004 0.87056375 0.29050563] # [ 0.55267505 0.59191276 0.20174988]] print arr6 # result: [ 5 8 11 14 17] print arr7 # result: [ 0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]
*代码详见:示例程序/code/5-2.py
2.访问数组
创建数组后,NumPy有很多方法接口去访问数组的属性。在科学计算时,我们需要频繁访问数组元素,通过NumPy索引、切片和迭代器方法能够快速灵活地访问数组,如代码清单5-2所示。
代码清单5-2 NumPy——访问数组
# 查看数组的属性 print arr2.shape # 返回矩阵的规格 # result: (2,3) print arr2.ndim # 返回矩阵的秩 # result: 2 print arr2.size # 返回矩阵元素总数 # result: 6 print arr2.dtype.name # 返回矩阵元素的数据类型 # result: float64 print type(arr2) # 查看整个数组对象的类型 # result: <type 'numpy.ndarray'> # 通过索引和切片访问数组元素 def f(x,y): return 10*x+y arr8 = np.fromfunction(f,(4,3),dtype = int) print arr8 # result: # [[ 0 1 2] # [10 11 12] # [20 21 22] # [30 31 32]] print arr8[1,2] #返回矩阵第 1行,第 2列的元素(注意下标从 0开始) # result: 12 print arr8[0:2,:] #切片,返回矩阵前 2行 # result: # [[ 0 1 2] # [10 11 12]] print arr8[:,1] #切片,返回矩阵第 1列 # result: [ 1 11 21 31] print arr8[-1] #切片,返回矩阵最后一行 # result: [30 31 32] # 通过迭代器访问数组元素 for row in arr8: print row # result: # [0 1 2] # [10 11 12] # [20 21 22] # [30 31 32] for element in arr8.flat: print element # 输出矩阵全部元素
*代码详见:示例程序/code/5-2.py
3.数组的运算
NumPy的运算是相当方便高效的,其运算符都是针对整个数组,比起使用for循环,使用NumPy的运算方法在速度上要优秀得多,如代码清单5-3所示。如果NumPy数组是一个矩阵,还支持矩阵求逆、转置等操作。
代码清单5-3 NumPy——数组的运算
print '''数组的运算 ''' arr9 = np.array([[2,1],[1,2]]) arr10 = np.array([[1,2],[3,4]]) print arr9 - arr10 # result: # [[ 1 -1] # [-2 -2]] print arr9**2 # result: # [[4 1] # [1 4]] print 3*arr10 # result: # [[ 3 6] # [ 9 12]] print arr9*arr10 #普通乘法 # result: # [[2 2] # [3 8]] print np.dot(arr9,arr10) #矩阵乘法 # result: # [[ 5 8] # [ 7 10]] print arr10.T #转置 # result: # [[1 3] # [2 4]] print np.linalg.inv(arr10) #返回逆矩阵 # result: # [[-2. 1. ] # [ 1.5 -0.5]] print arr10.sum() #数组元素求和 # result: 10 print arr10.max() #返回数组最大元素 # result: 4 print arr10.cumsum(axis = 1) #按行累计总和 # result: # [[1 3] # [3 7]]
*代码详见:示例程序/code/5-2.py
4.NumPy通用函数
许多数学上的函数,如sin、cos等在NumPy都有重新的实现。在NumPy中,这些函数称为通用函数(Universal Functions)。通用函数是针对整个NumPy数组的,因此我们不需要对数组的每一个元素都进行一次操作,它们都是以NumPy数组作为输出的,如代码清单5-4所示。
代码清单5-4 NumPy通用函数
print '''NumPy通用函数 ''' print np.exp(arr9) #指数函数 # result: # [[ 7.3890561 2.71828183] # [ 2.71828183 7.3890561 ]] print np.sin(arr9) #正弦函数(弧度制) # result: # [[ 0.90929743 0.84147098] # [ 0.84147098 0.90929743]] print np.sqrt(arr9) #开方函数 # result: # [[ 1.41421356 1. ] # [ 1. 1.41421356]] print np.add(arr9,arr10) #和 arr9+arr10效果一样 # result: # [[3 3] # [4 6]]
*代码详见:示例程序/code/5-2.py
5.数组的合并和分割
下面介绍如何通过方法接口对数组进行合并和分割,如代码清单5-5所示:
代码清单5-5 数组合并与分割
print '''数组合并与分割 ''' # 合并 arr11 = np.vstack((arr9,arr10)) #纵向合并数组,由于与堆栈类似,故命名为 vstack print arr11 # result: # [[2 1] # [1 2] # [1 2] # [3 4]] arr12 = np.hstack((arr9,arr10)) #横向合并数组 print arr12 # result: # [[2 1 1 2] # [1 2 3 4]] # 分割 print np.hsplit(arr12,2) # 将数组横向分为两部分 # result: # [array([[2, 1], # [1, 2]]), # array([[1, 2], [3, 4]])] print np.vsplit(arr11,2) # 数组纵向分为两部分 # result: # [array([[2, 1], # [1, 2]]), # array([[1, 2], [3, 4]])]
*代码详见:示例程序/code/5-2.py
由于篇幅所限,上面未能将NumPy的所有方法逐一介绍,以下附一张NumPy上面未涉及但却常用的方法清单,如表5-1所示,方便读者更好地了解NumPy的功能。
表5-1 其他NumPy常用方法
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论