购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2 数组和矩阵运算库NumPy

NumPy(Numerical Python)是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Python官网上的发行版是不包含NumPy模块的,安装NumPy最简单的方法就是使用pip工具命令,比如安装NumPy版本1.8.1的命令是pip install numpy==1.8.1。

3.2.1 列表和数组的区别

NumPy最重要的一个特点是其N维数组对象ndarray,它是一系列同类型数据的集合,以0下标开始进行集合中元素的索引。ndarray对象是用于存放同类型元素的多维数组,ndarray中的每个元素在内存中都有相同存储大小的区域。

示例代码如下,首先引入NumPy库,然后创建一个ndarray,这里只需调用NumPy的array函数即可。

    import numpy as np
    a=np.array([1,2,3])
    print(a)

运行结果如下:

    [1 2 3]

读者可能会有疑问,Python已经有列表类型,为什么还需要数组对象?NumPy支持数学运算,同样做乘法运算,列表是把元素复制一遍,而数组是对每个元素做乘法。列表存储的是一维数组,而数组则能存储多维数据。示例代码如下:

运行结果如下:

这里列表e虽然包含3个小表,但结构是一维的,而数组f则是3行2列的二维结构。

3.2.2 创建数组的方式

方法一:通过列表来创建数组,代码如下。代码中,创建一维数组a1,创建列表lst1,将列表lst1转换成ndarray。

输出结果如下:

方法二:使用NumPy中的函数创建ndarray数组,如arange、ones、zeros等,示例代码如下:

这里使用np.arange(n)函数(第一个参数为起始值,第二个参数为终止值,第三个参数为步长)。NumPy中有一些常用的用来产生随机数的函数,randn()和rand()就属于这类函数。下面使用np.linspace()根据起止数据等间距地填充数据,形成数组。示例代码如下:

运行结果如下:

3.2.3 NumPy的算术运算

NumPy最强大的功能便是科学计算与数值处理,比如有一个较大的列表,需要将每个元素的值都变为原来的10倍,NumPy的操作就比Python要简单得多。

NumPy中的加、减、乘、除与取余操作可以是两个数组之间的运算,也可以是数组与常数之间的运算。比如在计算中,常数是一个标量,数组是一个矢量或向量。一个数组和一个标量进行加、减、乘、除等算数运算时,结果是数组中的每个元素都与该标量进行相应的运算,并返回一个新数组。示例代码如下:

输出结果如下:

同样地,数组与数组也可以进行加、减、乘、除等相应的运算。原则上,数组之间进行运算时,各数组的形状应当相同,当两个数组形状相同时,它们之间进行算术运算就是在数组的对应位置进行相应的运算,示例代码如下:

输出结果如下:

在上面的运算中,数组之间的形状都是一致的。在一些特殊情况下,不同形状的数组之间可以通过“广播”机制来临时转换,满足数组计算的一致性要求。如下面的代码所示,a为2行3列的二维数组,b为1行3列的一维数组,原则上不能进行数组与数组之间的运算,但从结果显示,a数组与b数组之间的运算是将b数组的行加到a数组的每一行中。

运行结果如下:

同样地,当两个数组的行相同时,列上面也可以进行上述操作,规则与行相同,代码如下。在代码中,同样将a数组的每一列与b数组进行相加。

运行结果如下:

3.2.4 数组变形

数组变形最灵活的实现方式是通过reshape()函数来实现。

例如将数字1~9放入一个3×3的矩阵中,代码如下。该方法必须保证原始数组的大小和变形后数组的大小一致。如果满足这个条件,reshape方法将会用到原数组的一个非副本视图。

    import numpy as np
    a = np.arange(1,10).reshape((3,3))
    print(a)

运行结果如下:

另一个常见的变形模式是一个一维数组转为二维的行或列的矩阵。可以通过reshape方法来实现,或者更简单地在一个切片操作中利用newaxis关键字实现,代码如下:

运行结果如下: XGuQ5kloxnS9wKJBPbbflfRZ+6ryDdYqbEIKU6O7q55UEi8UCU0WGhNTdhreDSk6

点击中间区域
呼出菜单
上一章
目录
下一章
×