《利用python进行数据分析》——4.1 NumPy的ndarray一种多维数组对象——数组转置和轴对换——读书笔记

4.1 NumPy的ndarray一种多维数组对象

数组转置和轴对换

转置是重塑的一种特殊形式,它返回的是源数据的视图(不会进行任何复制操作)。

数组不仅有transpose方法,还有一个特殊的T属性:

In [126]: arr = np.arange(15).reshape((3, 5))

In [127]: arr
Out[127]:
array([[ 0, 1, 2, 3, 4],
       [ 5, 6, 7, 8, 9],
       [10, 11, 12, 13, 14]])

In [128]: arr.T
Out[128]:
array([[ 0, 5, 10],
       [ 1, 6, 11],
       [ 2, 7, 12],
       [ 3, 8, 13],
       [ 4, 9, 14]])

对于高维数组,transpose方法,需要得到一个由轴编号组成的元组才能对这些轴进行转置(比较费脑子):

transpose方法是数组用来转置的一种方法,尤其对于高维数组,transpose需要得到一个由轴编号组成的元组才能对这些轴进行转置。那么是怎么根据这个轴来完成转置的呢?

举个栗子:

举例说明:先创建一个2*2*4的三维数组:

In [59]: arrrr=np.arange(16).reshape((2,2,4))

In [60]: arrrr
Out[60]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

我假设这个三维数组在空间中按上图的方式排列,数组里每个数字存放在一个小立方体中

更具体一点,我们的俯视图如下:

clipboard.png

用表格展示这个数组arr,如下:

  长0 长1 长2 长3
高0.宽0 0 1 2 3
高0.宽1 4 5 6 7
  长0 长1 长2 长3
高1.宽0 8 9 10 11
高1.宽1 12 13 14 15
         
  长0 长1 长2 长3
高0.宽0 0 1 2 3
高0.宽1 8 9 10 11
  长0 长1 长2 长3
高1.宽0 4 5 6 7
高1.宽1 12 13 14 15

接着转化为坐标及对应的值,如下:

坐标
0.0.0 0
0.0.1 1
0.0.2 2
0.0.3 3
0.1.0 4
0.1.1 5
0.1.2 6
0.1.3 7
1.0.0 8
1.0.1 9
1.0.2 10
1.0.3 11
1.1.0 12
1.1.1 13
1.1.2 14
1.1.3 15

这也是数组取值时使用的坐标,例如:(1,0,0)对应8

In [60]: arrrr
Out[60]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

In [61]: arrrr[1,0,0]
Out[61]: 8

接下来,解释下整个转换的过程:

1.先定义需要被转化的数组(我们临时把他称为:原数组):

In [59]: arrrr=np.arange(16).reshape((2,2,4))

In [60]: arrrr
Out[60]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

原数组arrrr=np.arange(16).reshape((2,2,4))

咱们先定义一下:

用reshape(参数0,参数1,参数2)方法创建的数组时,

给参数0起名(编号)为:0轴,给参数1起名(编号)为:1轴,给参数2起名(编号)为:2轴,

每个轴对应的数值叫做:轴的长度

那么reshape((2,2,4)就可以表达为:创建0轴长度为2,1轴长度为2,2轴长度为4的数组arrrr。

2.解释转换过程

 

transpose方法,需要得到一个由轴编号组成的元组才能对这些轴进行转置

注意这句话的重点:轴编号!!!

轴编号就是咱们上面给轴起的名字:0轴、1轴、2轴

也就是说transpose方法中的参数是:轴编号(也就是咱们的0轴、1轴、2轴)

当数组是3维数组时,在transpose()方法中,其实就是0轴、1轴、2轴对应的就是0,1,2,

transpose()方法只能是0,1,2不重复的组合排列

即:transpose((1,0,2)),transpose((2,0,1)),transpose((2,1,0)),transpose((1,2,0)),transpose((0,2,1)),transpose((0,1,2))

【注:transpose((0,1,2))不会改变数组,因为0,1,2,其实就是数组创建时轴编号的顺序

.reshape((2,2,4)),其实是创建了0轴长度为2,1轴长度为2,2轴长度为4的数组】

使用其他数字或者是数字重复都会报错

In [63]: arrrr.transpose((1,3,2))
---------------------------------------------------------------------------
AxisError                                 Traceback (most recent call last)
<ipython-input-63-7a9f29aaebef> in <module>
----> 1 arrrr.transpose((1,3,2))

AxisError: axis 3 is out of bounds for array of dimension 3

In [64]: arrrr.transpose((1,1,2))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-64-01f32732ffe4> in <module>
----> 1 arrrr.transpose((1,1,2))

ValueError: repeated axis in transpose

In [65]: arrrr.transpose((1,0,1))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-65-778f0eb81639> in <module>
----> 1 arrrr.transpose((1,0,1))

ValueError: repeated axis in transpose

继续解释转换过程:

In [59]: arrrr=np.arange(16).reshape((2,2,4))

In [60]: arrrr
Out[60]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

In [62]: arrrr.transpose((1,0,2))

Out[62]:
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

因为创建数组时轴编号(0轴、1轴、2轴)的顺序默认就是(0,1,2)

所以arrrr.transpose((1,0,2))可以表达为:

将数组arrrr默认的(0轴、1轴、2轴)转换为(1轴、0轴、2轴),对应3维图就是“高宽互换”

3.得到转换后的数组

空间的转换比较难想象,我也没想,转换可以直接在,“坐标及对应值”的表中完成

即:原数组0轴那一列的内容和原数组1轴那一列的内容互换(值保持不变)就可得到转换后的数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值