前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Numpy中的转置轴对换

Numpy中的转置轴对换

作者头像
触摸壹缕阳光
发布2020-05-25 23:21:02
1.4K0
发布2020-05-25 23:21:02
举报

约着见一面就能使见面的前后几天都沾着光变成好日子

——猪猪

前言

转置是重塑的一种特殊形式。转置返回源数组的视图,源数组和对源数组进行转置操作后返回的数组指向的是同一个地址。Numpy中有三种方式能够对数组进行转置操作:

  1. T属性
  2. transpose函数
  3. swapaxes函数
代码语言:javascript
复制
import numpy as np

array = np.arange(12).reshape((3,4))
array2 = array.T

print("-----源数组-----")
print(array)
print(array2)
print("-----修改后的数组-----")
array2[0] = 10000
print(array)
print(array2)

-----源数组-----
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
-----修改后的数组-----
[[10000     1     2     3]
 [10000     5     6     7]
 [10000     9    10    11]]
[[10000 10000 10000]
 [    1     5     9]
 [    2     6    10]
 [    3     7    11]]

a

二维和高维数组的转置

需要注意的是只有二维数组(矩阵)以及更高维度的数组才能够进行转置操作,对Numpy中的一维数组进行转置操作是没有用的。

代码语言:javascript
复制
import numpy as np

# 一维数组
array = np.array([1,2,3,4])

print(array)
print(array.shape)
print(array.T)

[1 2 3 4]
(4,)
[1 2 3 4]

不能把一维数组或者调用shape属性返回元组为"( 元素个数 , )"这样的数组进行转置操作。在Numpy中既可以使用一维数组表示向量,也可以使用二维数组矩阵的形式表示向量。比如使用一维数组表示的向量可以使用dot函数计算两个向量之间的内积,但是如果使用二维数组表示的向量使用dot函数就需要依据矩阵乘法的运算法则来计算。这里主要介绍进行转置运算的方式,所以不再展开赘述,以后会有更加详细的介绍。

有三种方式可以将一维数组表示的向量转换为二维数组表示的向量:

代码语言:javascript
复制
import numpy as np

array = np.array([1,2,3,4])

print("-----方式一-----")
A = array.reshape(1,array.shape[0])
print(A)
print(A.shape)
print("-----方式二-----")
B = array[:,np.newaxis]
print(B)
print(B.shape)
print("-----方式三-----")
array.shape = (4,1)
print(array)
print(array.shape) 

-----方式一-----
[[1 2 3 4]]
(1, 4)
-----方式二-----
[[1]
 [2]
 [3]
 [4]]
(4, 1)
-----方式三-----
[[1]
 [2]
 [3]
 [4]]
(4, 1)

这里要注意一下reshape函数:

代码语言:javascript
复制
import numpy as np

array = np.arange(12).reshape((3,4))
array2 = array.reshape((3,4))
print("-----源数据-----")
print(array)
print(array2)
print("-----修改后的数据-----")
array2[0] = 10000
print(array)
print(array2)

-----源数据-----
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
-----修改后的数据-----
[[10000 10000 10000     3]
 [    4     5     6     7]
 [    8     9    10    11]]
[[10000 10000 10000]
 [    3     4     5]
 [    6     7     8]
 [    9    10    11]]

使用reshape函数返回的是源数组的视图,换句话说如果我们修改源数组,源数组自身也会被修改,它们操作的对象是同一个。

b

T 属性

T属性使用非常简单,使用T属性比较适用处理低维数组的转置操作(并不意味着它不能应用在高维数组上),正因为如此在实际操作中对矩阵(二维数组)的转置通常使用T属性。

即使是使用一维数组表示的向量我们也可以将其转化为二维数组的矩阵形式,所以这里直接使用二维数组进行演示。

代码语言:javascript
复制
import numpy as np

array = np.arange(12).reshape((3,4))
array2 = array.T

print(array.shape)
print(array2.shape)

(3, 4)
(4, 3)

通过实验结果来观察T的属性在高维数组上的应用,使用T属性和后面要介绍的transpose函数差不多,只不过T属性不能指定,只能使用的默认的转置方式,而transpose函数可以指定转置方式。

代码语言:javascript
复制
import numpy as np

array = np.arange(8).reshape((2,2,2))
array2 = array.T

print(array)
print(array2)

▲输出的结果

▲各个元素对应的位置

从上面各元素对应位置的图表可以很清楚的看出,使用T属性对高维数组进行转置,只能交换位置序列的第一个值和最后一个值,并且不能够指定。

c

transpose函数

通过前面的学习可以知道T属性非常适合处理二维数组矩阵,不过对于高维数组,T属性只能对第一个位置和最后一个位置进行转换并且不能指定。

不过transpose函数能够非常方便的处理高维数组的转置。在介绍多维数组的转置之前,来看看如何使用transpose函数对二维数组矩阵进行转置。

代码语言:javascript
复制
import numpy as np

array = np.array([1,2,3,4])

A = array[np.newaxis,:]
print("-----源数据-----")
print(A)
print(A.shape)
print("-----转置数据-----")
A = A.transpose()
print(A)
print(A.shape)

-----源数据-----
[[1 2 3 4]]
(1, 4)
-----转置数据-----
[[1]
 [2]
 [3]
 [4]]
(4, 1)
代码语言:javascript
复制
import numpy as np

array = np.arange(12).reshape((3,4))
print("-----源数据-----")
print(array)
print(array.shape)
print("-----转置数据-----")
array = array.transpose()
print(array)
print(array.shape)

-----源数据-----
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
(3, 4)
-----转置数据-----
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
(4, 3)

介绍完了二维数组,接下来看一看transpose函数如何对高维数组进行转置。对于高维数组来说,transpose需要用到一个由编号组成的元组,这样才能进行转置,其实上面在介绍T属性的时候已经分析过了,这里说的编号对应的是形状元组的位置,这样说应该很抽象,我们以实际三维数组为例进行分析:

代码语言:javascript
复制
array = np.arange(8).reshape((2,2,2))

▲对应关系

继续看下面的代码:

代码语言:javascript
复制
import numpy as np

array = np.arange(8).reshape((2,2,2))
print(array)
print(array.transpose(0,1,2))

▲打印输出结果

从上面我们可以看见输出结果并没有发生任何的改变,那我们再来看一个例子:

代码语言:javascript
复制
import numpy as np
array = np.arange(8).reshape((2,2,2))
print(array)
print(array.transpose(2,1,0))

▲输出结果

可以看出和前面使用T属性进行转置的效果是一样的,我想你一定看出了这其中的奥秘所在,默认的元组中的顺序是(0,1,2),我们调用transpose(元组序列),这里我们传入的参数是(2,1,0)。对比一下会发现,第一个元素位置和最后一个元素的位置发生了改变。

d

swapaxes函数

Numpy中还有一个swapaxes函数,它需要接受一对轴编号。先看一个有趣的东西:

代码语言:javascript
复制
import numpy as nparray = np.arange(8).reshape((2,2,2))
print(array)
print(array.swapaxes(0,2))

▲输出结果

这里为了方便都将第一个轴和最后一个轴进行转置,三种转置方式得到的结果是一样的,不过可以看出swapaxes是以轴为单位的,并且只能传入两个轴参数。下面是二维数组的axis顺序,如果是三维数组的话还有一个axis 2的轴,以此类推。

▲二维数组的轴

对于三维数组来说,三个轴分别为axis 0,axis 1,axis 2,这些轴就这些转置操作所变换的对象。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档