Python科学计算库NumPy的使用
NumPy的介绍
NumPy(Numerical Python的缩写)是一个开源的Python科学计算库。使用NumPy,就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等功能。如果你的系统中已经装有LAPACK,NumPy的线性代数模块会调用它,否则NumPy将使用自己实现的库函数。LAPACK是一个著名的数值计算库,最初是用Fortran写成的,Matlab同样也需要调用它。从某种意义上讲,NumPy可以取代Matlab和Mathematica的部分功能,并且允许用户进行快速的交互式原型设计。
NumPy的数组对象
ndarray是一个多维数组对象,该对象由实际数据+描述性元数据组成。 使用Numpy需要先安装和导入NumPy库,有关安装教程可以参考Installing NumPy
导入语法:import numpy as np
此处使用np为别名是为了避免命名空间被污染。
特点:
- NumPy数组一般是同质(即数组内的元素为相同类型,特殊类型除外)
- NumPy数组的下标也是从0开始
- 可以方便地创建高维数组
eg:
1 2 3 |
|
而在32位系统中,得到的结果类型可能是int32。
多维数组的创建:
1 2 3 4 5 6 7 |
|
选取数组元素: 我们继续沿用上面创建的数组m
1 2 3 4 |
|
是的,从数组中选取元素就是这么简单。对于数组 a ,只需要用 a[m,n] 选取各数组元素,其中 m 和 n 为元素下标。
NumPy的数据类型: Python支持的数据类型有整型、浮点型以及复数型,但这些类型不足以满足科学计算的需求,因此NumPy添加了很多其他的数据类型。在NumPy中,许多函数的参数中可以指定数据类型,通常这个参数是可选的:
1 2 |
|
其中完整的数据类型可以通过np.sctypeDict.keys()查到:
1
|
|
创建自定义数据类型:
(1)创建数据类型
1 2 3 |
|
(2)查看数据类型
1 2 |
|
(3)使用自定义数据
1 2 3 |
|
一维数组的索引和切片:
1 2 3 |
|
多维数组索引和切片:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
同时,b[0,:,:] == b[0,…]。 更多的多维数组的索引和切片操作可以参考NumPy使用手册
数组展平:
(1)ravel
1 2 3 4 5 6 7 8 9 10 11 12 |
|
(2)flatten
1 2 3 4 |
|
flatten 和 ravel的区别在于:flatten函数会请求分配内存来保存结果,而reval函数只是返回数组的一个视图(view)
(3)改变数组的shape属性
1 2 3 4 5 6 7 8 9 |
|
(4)transpose,相当与线性代数的转置
1 2 3 4 5 6 |
|
(5)resize,功能和reshape相同,但是resize会直接影响原操作数组
1 2 3 4 5 |
|
数组组合:
(1)水平组合
1 2 3 4 5 6 |
|
同样可以使用concatenate函数实现同样效果
1 2 3 4 |
|
(2)垂直组合
1 2 3 4 5 6 7 |
|
同样可以使用concatenate函数实现同样效果
1 2 3 4 5 6 7 8 |
|
(3)深度组合
深度组合,就是将一系列数组沿着纵轴(深度)方向进行层叠组合。举个例子,有若干张二维平面内的图像点阵数据,我们可以将这些图像数据沿纵轴方向层叠在一起,这就形象地解释了什么是深度组合。
1 2 3 4 5 6 7 8 9 10 11 |
|
(4)列组合,column_stack 函数对于一维数组将按列方向进行组合,而对于二维数组, column_stack 与 hstack 的效果是相同的
(5)行组合,当然,NumPy中也有按行方向进行组合的函数,它就是 row_stack 。对于两 个一维数组,将直接层叠起来组合成一个二维数组。同样,对于二维数组,row_stack 与 vstack 的效果是相同的。
数组分割:
NumPy数组可以进行水平、垂直或深度分割,相关的函数有 hsplit 、 vsplit 、 dsplit 和split 。我们可以将数组分割成相同大小的子数组,也可以指定原数组中需要分割的位置。
(1)水平分割
1 2 3 4 5 6 7 8 9 10 11 12 |
|
(2)垂直分割
1 2 |
|
(3)深度分割,dsplit函数将按深度方向分割数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
同时,hsplit,vsplit同样也可以用函数split来实现,其使用就像上面的数组组合函数concatenate类似
到此,NumPy的常规的数组操作基本就结束了!