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

3.5 矩阵变形

使用NumPy创建完矩阵对象后,用户常常需要调整矩阵的对象。如前所述,使用arange()函数或linspace()函数创建向量后常常需要使用reshape()函数将生成的向量调整形状,从而获得新的矩阵对象。如表3-6展示了一些常用的修改矩阵形状的函数。

表3-6 修改ndarray矩阵形状的方法

如下所示,使用reshape()方法时需要以元组的方式给定ndarray矩阵对象新的形状。参数order是用来指定ndarray矩阵对象重组新形状时按照何种次序排列元素,可以是'C'或者'F',分别对应行优先索引和列优先索引。

reshape(newshape, order='C')

如图3-20所示为使用reshape()方法将一个1 × 12的行向量的形状分别调整为3 × 4、4 × 3、6 × 2和2 × 6。

图3-20 reshape()方法示例

reshape()方法中的order参数可以用来控制索引元素的顺序。如图3-21对比了如何使用order参数来调整一个2 × 3矩阵。当order ='C'时,沿着行的方向索引元素并调整矩阵的形状,当order ='F'时,沿着列的方向索引元素并调整矩阵的形状。

图3-21 reshape()方法示例,控制索引元素

resize()方法和reshape()方法类似,都可以修改矩阵的形状,但有两个不同之处。第一个是resize()方法不提供order参数,即只能沿着水平方向调整矩阵的形状;第二个不同之处是resize()方法会修改原矩阵的形状而无返回值,而reshape()方法则不修改原矩阵的形状但返回形状修改后的矩阵。

resize()方法还支持扩大矩阵的形状。如图3-22所示,原矩阵 a 的形状是2×3,使用np.resize(a,(3,3))函数扩大矩阵时,填充的元素则是重复的原矩阵的元素。

图3-22 resize()方法

如表3-6中的ravel()方法和flatten()方法可以将矩阵展平成一个一维向量,如图3-23中的例子所示。ravel()方法和flatten()方法最大的不同是,ravel()方法只返回原矩阵的一个 视图 (view),而flatten()方法则会返回一个复制对象。

ndarray.flatten(order='C')

flatten()方法中order参数默认为'C',表示将数组按照行方向展平为一维数据,当order参数是'F'时,表示将数组按照列方向展平为一维数组。

图3-23 ravel()方法

表3-6中的squeeze()方法则可以用于删除矩阵中维度为1的矩阵,如图3-24所示。

图3-24 squeeze()方法

以下代码展示了图3-24中降维的过程。

>> print(np.ones(9).reshape(1,3,3).shape)#Output:(1,3,3)
>> print(np.ones(9).reshape(1,3,3).squeeze().shape)#Output:(3,3)

repeat()方法可以用来重复矩阵中的元素,它的定义如下。

a.repeat(repeats, axis = None)

其中,repeats参数用来指定重复的次数,对于向量,axis参数一般不用指定,但对于矩阵,axis参数可以用来指定在行方向或者列方向上进行元素重复。如图3-25展示了如何使用repeat()方法重复一维向量中的元素。

图3-25 repeat()方法应用在向量上

对于二维矩阵,使用repeat()方法需要指定重复复制的方向。如图3-26展示了NumPy中轴的定义,axis = 0表示沿着平面内竖直方向进行重复复制,axis =1表示沿着平面内水平方向进行重复复制。

图3-26 NumPy中轴的定义

如图3-27展示了如何在一个二维矩阵中使用repeat()方法沿着水平方向和垂直方向进行矩阵元素的复制。

图3-27 repeat()方法应用在二维矩阵上

以下代码展示了图3-27的运算结果。运行代码后,读者可发现,使用repeat()方法并不改变原矩阵的形状,它只会返回修改形状后的矩阵。

sort()方法可以用来对每一行或每一列中的元素进行排序,排序后矩阵元素的次序发生变化。使用sort()方法时,当axis = 1表示沿着矩阵的水平方向(即行方向)进行元素排序,axis = 0表示沿着矩阵的垂直方向(即列方向)进行元素排序。

图3-28 sort()方法

读者可自行运行以下代码。

本章介绍了如何在NumPy中创建向量和矩阵对象。在此基础上,第4章将会讨论如何在Python中利用这些矩阵对象进行基本的数学运算。 VUUUiDcza6QTIEuVSIM5RjvsA1VFxtrap2Bo4IGyC64KLttiH72NMhLDbrEvVsDD

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