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

3.3 其他矩阵创建函数

NymPy中矩阵的创建除了前面介绍的函数,还有其他许多函数。本节首先介绍empty()、ones()和zeros(),它们的定义和使用方法都非常类似,如下所示。

np.empty(shape, dtype=float, order='C')
np.ones(shape, dtype=float, order='C')
np.zeros(shape, dtype=float, order='C')

这三个函数分别可用于创建空矩阵、元素全为1的矩阵和元素全为0的矩阵,以下代码展示了如何使用empty()、ones()和zeros()函数生成ndarray矩阵对象。

代码运行结果如下所示。这三个函数使用时,需要给定待创建的矩阵的形状shape,它可以是一个列表、元组或ndarray矩阵对象,但不能是一个集合,此外,empty()函数生成的ndarray矩阵对象的值是系统随机产生的。

对于 对角矩阵 (diagonal matrix)和 单位矩阵 (identity matrix),它们可以通过identity()、eye()和diag()三个函数创建。identity()函数可用于生成 方阵 (square matrix),其定义如下。

np. identity(n,dtype=float)

其中n是一个整数,表示方阵的行数或者列数,方阵的形状是 n × n ,dtype默认为float。另外一个可以生成对角矩阵和单位矩阵的函数是eye(),它的定义如下。

numpy.eye(n,m=None,k=0,dtype=float,order='C')

其中,n是矩阵的行数,m是矩阵的列数,m默认等于n,k是对角线的位置,dtype默认为float,order默认为‘C’。对比这三个创建对角矩阵的函数,eye()函数比identity()函数更强大,identity()只能生成方阵,形状为 n × n ,而eye()函数可以生成 n × m 的矩阵。此外,eye()函数可以通过 k 调整非零元素所在对角线的位置。如图3-5所示为一个4 × 4的矩阵,该矩阵展示了 k 不同时对应的非零元素所在对角线的位置。

图3-5 k 不同时对角线位置

查看NumPy的代码可以发现,identity()函数实际上封装了eye()的函数,以下代码对比了使用eye()函数和identity()函数创建对角矩阵或者单位矩阵的例子。

上述代码的运行结果如下。

第三种可以用来创建对角矩阵的函数是diag(),它的定义如下。

numpy.diag(v, k=0)

其中,v可以是一维向量,也可以是二维矩阵。k表示对角线的位置,默认值为0,即为主对角线。除了可以用来创建对角矩阵,diag()函数还可以提取某矩阵对角线上的元素。这也是diag()函数比eye()函数强大的地方。如图3-6展示了如何使用diag()函数提取矩阵的对角线元素或者生成对角矩阵。

图3-6 np.diag()使用例子,(a)原矩阵 A ,(b)diag()函数用于提取矩阵对角线上的元素,(c)使用diag()函数生成对角矩阵

以下代码展示了图3-6中的结果。

如图3-7展示了如何在diag()函数中使用一个一维向量创建不同的对角矩阵,这些对角矩阵非零元素的对角线的位置可以通过在diag()函数中指定,矩阵的形状也因此发生变化。在图3-7(a)中,由于对角线的位置默认为0,因此非零元素位于主对角线上,此时矩阵的形状是3 × 3。当对角线的位置分别为1和-1时,生成的矩阵的形状是4 × 4,非零元素分别位于主对角线的上方和下方。

图3-7 np.diag()通过一个向量创建矩阵(例子中a = [1,2,3])

接下来将会讨论表3-2中第四种矩阵生成方法,包括arange()函数、linspace()函数和logspace()函数。arange()和linspace()函数都可以用来生成某一区间内均匀分布的数值构成的向量。arange()函数根据给定的起始值、终止值和步长创建一维的等差数列向量,而linspace()函数根据给定的起始值、终止值和向量元素个数来创建一维等差数列的向量。logspace()函数则是创建一维等比数列的向量。

arange()、linspace()和logspace()函数的定义如下。

其中,start是起始值,在arange()函数中默认为0。stop为终止值,arange()函数生成的等差数列不包含终止值。step为步长,默认为1。在linspace()和logspace()函数中需要指定生成的元素个数num,默认值为50。此外,endpoint默认为True,表示在linsapce()和logspace()函数生成的数列包含终止值stop,若endpoint = False,则生成的数列不包含终止值。logspace()函数中还可以指定等比数列的底数,默认为10。虽然这三个函数只能生成一维向量,但可以通过reshape()函数将这些一维向量元素转化为矩阵形式,在3.5节中将会详细讨论。以下代码展示了在命令窗口中使用这几个函数的例子。

此外,zeros_like()、empty_like()、ones_like()和full_like()这四个函数可以用来创建一个和某矩阵对象形状一样的矩阵,并填充指定的元素。zeros_like()、empty_like()、ones_like()函数分别将元素替换为0、None和1,这三个函数的定义很类似,如下所示。

在上述函数定义中,a是原来的ndarray矩阵对象,dtype是指定的数据类型,默认为None,即数据类型和a一致,order指定数据在内存中存储的次序,默认为k,即和a的数据在内存中的存储次序一致,shape是用来指定新ndarray矩阵对象的形状,默认为None,即形状和a一致。一般而言,不建议修改形状,因为这些函数的初衷是帮助用户创建和a形状一致的ndarray矩阵对象。

full_like()函数稍有不同,它多了一个参数fill_value,这个参数可以用来指定新创建的ndarray矩阵对象中需要填充的元素值。full_like()函数的其他参数和zeros_like()、empty_like()及ones_like()函数一致。

numpy.full_like(a, fill_value, dtype=None, order='K',shape=None)

以下代码例子展示了如何使用这四个函数。

运行结果如下。

图3-8 几何形式的网格

meshgrid()函数常常用来生成二维平面坐标系中的横纵坐标,且把横坐标 x 和纵坐标 y 分别存在 X Y 两个矩阵里,如图3-8所示。在3D绘图里,竖坐标 z 可以是横坐标 x 和纵坐标 y 计算的函数。

此外,本节的开头介绍了几何空间的索引和矩阵的索引方式是相反的。如图3-8所示是几何空间索引。meshgrid()函数还提供了获得二维矩阵索引号的方法。如图3-9所示为矩阵索引形式的网格。对比两种网格,采用几何空间索引方式获得的网格形状是3 × 5,而采用矩阵形式的网格形状是5 × 3。

图3-9 矩阵索引形式的网格

NumPy中meshgrid()函数的定义如下。

numpy.meshgrid(*xi, sparse=False, indexing='xy')

其中*xi代表数量不确定的一维向量,用户可提供 n 个一维向量用来表示生成 n 维网格。sparse默认为False,表示生成 稠密矩阵 (dense matrix),当sparse为True时,表示将生成 稀疏矩阵 (sparse matrix)。在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布无规律时,则该矩阵为稀疏矩阵;若非0元素数目占大多数时,则该矩阵为稠密矩阵。indexing用来控制生成不同索引方式的网格,当indexing ='xy'时,表示生成几何网格,当indexing ='ij'时,表示生成矩阵索引形式的网格。

读者可运行以下代码,生成图3-8和图3-9两种不同的网格。

以下例子展示了使用meshgrid()函数生成网格并绘制三维图,如图3-10所示。

图3-10 meshgrid()函数用于绘图

本节最后介绍如何使用fromfunction()函数创建ndarray矩阵对象。fromfunction()函数可以通过别的函数来创建更复杂的矩阵,fromfunction()函数的定义如下。

np.fromfunction(function, shape, dtype)

其中传入的函数function既可以是lambda匿名函数,也可以是用def定义的普通函数。shape是一个元组,用来生成矩阵网格。

以下代码展示了如何使用fromfunction()函数和lambda匿名函数创建ndarray矩阵对象。

前文介绍了使用meshgrid()函数创建二维坐标网格,生成网格的横坐标 x 和纵坐标 y 矩阵,进而通过函数计算竖坐标 z 的值。fromfunction()函数提供了一种更简捷的方法,可以自动生成二维坐标的网格并根据函数完成计算。在以下例子中,fromfunction()函数调用了另外一个使用def定义的函数,在调用这个函数时,还提供了一个元组(5,3),这个元组会被用来生成矩阵索引型网格。以下例子生成的网格如图3-9所示。

运行结果如下。 5e41GNGJVO2qhGO80IGhfC3uECUco63tO9HIlmy16pgSL3f7+/3EF4nclE9FXaZA

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