python、matlab高维数组转置

转置(transpose)和轴对换

原文:https://www.cnblogs.com/sunshinewang/p/6893503.html

转置可以对数组进行重置,返回的是源数据的视图(不会进行任何复制操作)。

转置有三种方式, transpose方法、 T属性以及 swapaxes方法。

1 .T,适用于一、二维数组

In [ 1]: import numpy as np

In [2]: arr = np.arange(20).reshape(4,5)#生成一个4行5列的数组

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

In [4]: arr.T #求转置
Out[4]:
array([[ 0, 5, 10, 15],
[ 1, 6, 11, 16],
[ 2, 7, 12, 17],
[ 3, 8, 13, 18],
[ 4, 9, 14, 19]])

2. 高维数组

对于高维数组,transpose需要用到一个由轴编号组成的元组,才能进行转置。

这里,着实好好理解了一下。开始的时候怎么都想不明白。因为他跟矩阵转置理解起来不太一样。

主要参考:
AbstractSky的博客
Albert Chen
经管之家

对多维数组来说,确定最底层的一个基本元素位置需要用到的索引个数即是维度。这句话的理解可以结合我索引和切片的那篇文章理解。

我是这样的理解的,比如说三维的数组,那就对维度进行编号,也就是0,1,2。这样说可能比较抽象。这里的0,1,2可以理解为对shape返回元组的索引。
比如:

In [ 59]: arr1 = np.arange( 12).reshape( 2, 2, 3)

In [60]: arr1
Out[60]:
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
In [61]: arr1.shape #看形状
Out[61]: (2, 2, 3) #说明这是一个223的数组(矩阵),返回的是一个元组,可以对元组进行索引,也就是0,1,2

形状 索引
2 0
2 1
3 2

所以说,transpose参数的真正意义在于这个shape元组的索引。

那么它的转置就应该是

In [62]: arr1.transpose((1,0,2))
Out[62]:
array([[[ 0, 1, 2],
[ 6, 7, 8]],
[[ 3, 4, 5],
[ 9, 10, 11]]])

比如,数值6开始的索引是[1,0,0],变换后变成了[0,1,0]
这也说明了,transpose依赖于shape

但是,对于为什么转置最后一个索引是不动的,颇为不解。数组或者说矩阵的这块有点太抽象了。虽然我线代成绩不错,但是这玩意不太一样啊。

3.swapaxes

虽然还有点不解的地方,但是,理解了上方那部分之后,swapaxes方法也就很好理解了。它接受一对轴编号。进行轴对换。其实也就是shape参数。

In [ 67]: arr2 = np.arange( 16).reshape( 2, 2, 4)In [ 68]: arr2 Out[ 68]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [ 12, 13, 14, 15]]]) In [ 69]: arr2.shape Out[ 69]: ( 2, 2, 4) In [ 70]: arr2.swapaxes( 1, 2) Out[ 70]: array([[[ 0, 4], [ 1, 5], [ 2, 6], [ 3, 7]], [[ 8, 12], [ 9, 13], [ 10, 14], [ 11, 15]]]) In [ 4]: arr2.swapaxes( 1, 0) #转置,对比transpose(1,0,2) Out[ 4]: array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]], [[ 4, 5, 6, 7], [ 12, 13, 14, 15]]])

高维数组的转置使用permute函数
具体调用语法
B = permute(A,order)
按照向量order指定的顺序重排A的各维。B中元素和A中元素完全相同。但由于经过重新排列,在A、B访问同一个元素使用的下标就不一样了。order中的元素必须各不相同。
例子:

A=rand(4,5,6);
size(A)
ans =
4 5 6

B = permute(A,[2 1 3]);
size(B)
ans =
5 4 6

原来A是4x5x6的矩阵
按照顺序[2 1 3]转置之后,原来的第一,第二维顺序改变
B的大小是5x4x6

发布了21 篇原创文章 · 获赞 47 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/h_l_dou/article/details/85049165