NumPy入门详解

概述

NumPy和SciPy是开源的 Python 的科学计算模块,这俩货提供了预编译的快速的数学函数,基于C语言开发。这两个库已经发展的很成熟了,NumPy 包提供了大数组和矩阵函数。SciPy 扩展了NumPy包,它集成了很多有用的算法,像最小值,傅立叶变换,线性回归等等。

安装

引入 NumPy 模块

有几种方法引入Numpy模块,标准做法是用 import 语句。

但是如果你调用了大量的NumPy函数,一遍一遍的写 numpy.X 就比较烦了,下面用给numpy 起一个短一点的名字。

这个语句可以用 np.x 代替 numpy.x。如果连简称都不想要,就像调用内建函数一样,一般不建议这个引入方法。

数组

NumPy 的中心就是 array 类。这里的数组和python的list很像,除了数组里的每个元素必须是同一个类型,典型的是数字类型,像 float 和 int。Array可以操作大量的数据而且比list要高效的多。

数组可以用list创建:

在这里函数 array 使用两个参数:list 和 数据的类型。数组元素可以被访问,分割,操作,就像list一样:

不像list,数组可以是多维的,下面是两维数组的例子:

数组的分割在多维数组里是一样的,每个分割应用到相应的维度:

数组的形状(shape)属性是每个维度的个数:

数组的 dtype 属性告诉你数组元素的类型:

len 函数返回第一轴长度:

in 测试值是否在数组中:

数组可以被重新排列,下面把一个一维数组转化为二维数组:

注意 reshape 函数创建了一个新的数组,并不是在修改原来的数组。

copy 函数创建一个新的,分离的内存拷贝:

list 也可以用数组创建:

我们可以把数组的原始数据转化为二进制字符串(tostring 函数),fromstring 是 tostring 的反过程。tostring 函数可以很方便的把数组数据存储到文件中,以后需要时再用 fromstring 函数进行读取:

fill 可以用一个值填充数组:

transpose 对数组进行转置,生成一个新的数组:

flatten 把多维数组转为一位数组:

concatenate 把多个数组串联起来:

如果数组有多个维度,可以指定维度进行串联,默认情况下 concatenate 串联第一个维度:

newaxis 常量增加维度:

newaxis 为向量和矩阵运算生成适当的维度。

创建数组的其它方法

arange 函数和 range 类似,不同的是 arange 返回数组

zeros 和 ones 函数创建一个指定维度的数组,并且分别填充0,1。这两个也许是最常用的创建数组的方法:

zeros_like 和 ones_like 用已存在数组的维度创建新数组,并分别填充0,1:

创建一个给定大小的2维单位矩阵:

eye 函数生成一个”对角”矩阵:

数组之间的数学计算

数组之间进行计算的时候注意数组的维数,相同大小的数组可以加,减…:

对于2维数组的乘积,执行的是数组元素依次相乘,注意,和矩阵乘法是不一样的:

如果大小不同,返回如下错误:

对于多维数组来说,如果维度数不同,python 可以对数组进行扩展,然后执行数学操作。用最小维的数组填充:

数组 b 在执行运算时,填充为:

可以指定 newaxis 指定计算方式:

在标准计算之上,NumPy 还提供了大量的常用数学函数,abs, sign, sqrt, log, log10, exp, sin, cos, tan, arcsin, arccos, arctan, sinh, cosh, tanh, arcsinh, arccosh,和 arctanh。

floor,ceil,rint:

NumPy 中两个重要的数学常量:

数组的遍历

数组的遍历类似list的遍历:

二维数组:

遍历数组时可以使用乘法:

基本数组操作

很多函数都是为了得到数组的属性;数组里的元素可以相加或相乘:

上面使用的是成员函数,也可以用 NumPy 的标准函数:

数组的平均值,方差,标准差:

数组中的最大最小元素:

argmin 和 argmax 函数返回最小最大值的索引:

对于多维数组,所有的函数都可以指定一个 axis 指定操作沿哪个轴(横竖):

数组排序:

把数组里的元素限制到指定范围,就相当于对每个元素执行 min(max(x, minval), maxval) 操作:

取出不重复元素:

对于2维数组,取出对象元素:

比较操作

按每元素比较:

any 和 all 测试数组里的bool是否都为true:

对数组的每个元素执行 与(and),或(or),非(not)操作:

where 函数,where(<判断>真假,真,假),类似 a > b ? a : b :

nonzero 返回非0的元组的索引:

判断 NaN 和 Inf:

数组元素的选择和操作

Bool数组可以用来选择元素:选出大于等于6的值

又一个例子:

除了用bool,还可以用整数数组当成索引,用来选择数组里的元素:

同:

如果是多维数组,我们可以用多个一维数组,例如:

第一个数组指定维数,对应的第二个数组指定索引。

take 函数和[]是一样的:

take 还提供了axis 参数:

和 take 相对的函数是 put:

上面的7没有用到,下面的5背重复使用

向量和矩阵数学

点乘:

点乘可应用于矩阵相乘:

矩阵和向量的内积,外积,和十字相乘。对于向量,内积和点乘是等价的:

NumPy 内建线性代数计算,在 linalg 的子模块中可以找到。求矩阵的行列式:

本征值和特征向量:

矩阵的逆:

奇异值分解:

多项式

NumPy 提供了处理多项式的方法。给一组根,找多项式系数:

多项式 x^4-11x^3+9x^2+11x-10

给一组系数,求根,和上面相反的操作:

注意:x^3+4x^2-2x+3 的两个根是虚数。

求积分。x^3+x^2+x+1 的积分是 x^4/4+x^3/3+x^2/2+x+C,C是常数,默认为0:

同样的,求导数:

polyadd, polysub, polymul, 和 polydiv 函数处理多项式系统的加,减,乘除。

polyval 求某一点的值,如求 x^3-2x^2+2x=4 时的值:

polyfit 函数使用最小二乘法,做曲线拟合:

返回了多项式系数。插值法可以在 SciPy 里找到。

统计

除了求数组的平均值,方差和标准差。NumPy 还提供一些其它函数。

求中值:

相关系数:

协方差:

随机数

设置随机种子:

种子为整数。

生成的随机数的范围 [0.0, 1.0):

指定维数,下面两种方法等价:

生成一个随机数:

生成指定范围的整数随机数:

离散泊松分布:

高斯分布:

正态分布:

指定个数:

随机洗牌;随机排列一个list:

其它

还有很多函数没有列出,像离散傅立叶变换,复杂的线性代数… 读官方文档获取更多信息 http://docs.scipy.org/doc。

SciPy 中的模块

导入:

列出帮助信息:

SciPy 提供了很多数学算法,不在详细列出了,文档http://docs.scipy.org/doc
我们在下面列出了主要模块:

  • scipy.constants:数学和物理常量
  • scipy.special:数学物理
  • scipy.integrate:积分
  • scipy.optimize
  • scipy.linalg
  • scipy.sparse
  • scipy.interpolate
  • scipy.fftpack
  • scipy.signal
  • scipy.stats

社区里的一大群开发者在不断的往SciPy中加入新功能。如果你要在代码里实现什么数学算法,最好是先看一下Scipy文档,看看有没有什么现成的玩意。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注