Python3 numpy .T/transpose/swapaxes数组转置详解

版权声明:原创文章,转载请注明出处! https://blog.csdn.net/L_15156024189/article/details/84874310

1、numpy中的数组

(1)数组维数

import numpy as np

arr1d = np.arange(24).reshape(24)
print('一维数组:', arr1d)

arr2d = np.arange(24).reshape((4, 6))
print('二维数组:\n', arr2d)

arr3d = np.arange(24).reshape(2, 3, 4)
print('三维数组:\n', arr3d)

输出结果:

一维数组: [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
二维数组:
 [[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
三维数组:
 [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

Process finished with exit code 0

arrange()方法产生整数0~23,并重新按指定维数分配。

(2)数组元素索引

一维数组arr1d可以通过下标i(0 =< i <= len(arr1d)-1)来索引,例如arr1d[6]=6,也就是说一个下标i对象数组中的一个元素,反之亦然。

二维数组arr2d可以通过两个下标i(0 =< i <= 数组行数-1)和j(0 =< j <= 数组列数-1)来索引,例如arrd2d[2][5]=17,也就是说一对下标(i,j)对应数组中的一个元素。

三维数组arr3d可以通过三个下标i(0 =< i <= reshape方法中第一个参数-1)、j(0 =< j <= 数组行数-1)和k(0 =< k <= 数组列数-1)来索引,例如arrd3d[0][1][2]=6,也就是说下标(i,j,k)对应数组一个元素。

类似地,n维数组arrdnd可以通过下标(m1,m2,m3,...,mn)来索引。

我们知道,对于二维平面中的一个点(x,y),x称为该点的横坐标或x-轴坐标,y称为该店的纵坐标或y-轴坐标,类似的,我们可以将下标(m1,m2,m3,...,mn)看成一个n维空间中的点,在这个空间中也有坐标轴,因为有n个坐标轴,用单个字母无法命名,所以我们给每个坐标轴编一个号,分别称为0-轴,1-轴,2-轴,……,n-轴。

2、numpy的.T转置

import numpy as np


arr2d = np.arange(24).reshape((4, 6))
print('二维数组:\n', arr2d)
print('二维数组转置后:\n',arr2d.T)

arr3d = np.arange(24).reshape(2, 3, 4)
print('三维数组:\n', arr3d)
print('三维数组转转置后:\n',arr3d.T)

输出结果:

二维数组:
 [[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
二维数组转置后:
 [[ 0  6 12 18]
 [ 1  7 13 19]
 [ 2  8 14 20]
 [ 3  9 15 21]
 [ 4 10 16 22]
 [ 5 11 17 23]]
三维数组:
 [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
三维数组转转置后:
 [[[ 0 12]
  [ 4 16]
  [ 8 20]]

 [[ 1 13]
  [ 5 17]
  [ 9 21]]

 [[ 2 14]
  [ 6 18]
  [10 22]]

 [[ 3 15]
  [ 7 19]
  [11 23]]]

Process finished with exit code 0

.T对二维数组操作比较容易,只是行列转换,三维看起来有些难度,更不要说n维数组了,那么.T究竟做了什么了,其实只是将数组下标反序,例如n维数组arrdnd的下标(m1,m2,m3,...,mn)对应的元素,经过.T转置后,在(mn,...,m2,m1)的位置上,例如:

arrnd=np.arange(120).reshape(1,2,3,4,5)
arrndT=arrnd.T
print('arrnd[0][1][2][3][4]=', arrnd[0][1][2][3][4])
print('arrndT[4][3][2][1][0]=', arrndT[4][3][2][1][0])

输出结果:

arrnd[0][1][2][3][4]= 119
arrndT[4][3][2][1][0]= 119

示例中定义了一个5维数组。

3、 numpy的transpose

首先我们来看一个三维数组的例子:

import numpy as np

arr3d = np.arange(24).reshape(2, 3, 4)
print('三维数组:\n', arr3d)
arr3dT=arr3d.transpose(1, 0, 2)
print('三维数组转转置后:\n', arr3dT)

输出结果:

三维数组:
 [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
三维数组转转置后:
 [[[ 0  1  2  3]
  [12 13 14 15]]

 [[ 4  5  6  7]
  [16 17 18 19]]

 [[ 8  9 10 11]
  [20 21 22 23]]]

Process finished with exit code 0

transpose究竟做了什么?首先对三维数组的维数(2,3,4)依次编号0,1,2,称之为0-轴,1-轴,2-轴。transpose(1,0,2)表示对换了1-轴和0-轴(本来应该是0,1,2)的位置,2-轴没变。也就是说tranpose会将下标(i,j,k)对应的元素变换到下标(j,i,k)上。例如三维数组元素11的原来下标位置是(0,2,3),通过transpose应该变换到(2,0,3)的位置上,变化后的数组(2,0,3)的位置上确实是11。

3、numpy的swapaxes

swapaxes顾名思义是交换轴的意思。我们看个例子:

import numpy as np

arr3d = np.arange(24).reshape(2, 3, 4)
print('三维数组:\n', arr3d)
arr3dT=arr3d.swapaxes(2, 1)
print('三维数组转转置后:\n', arr3dT)


输出结果:

三维数组:
 [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
三维数组转转置后:
 [[[ 0  4  8]
  [ 1  5  9]
  [ 2  6 10]
  [ 3  7 11]]

 [[12 16 20]
  [13 17 21]
  [14 18 22]
  [15 19 23]]]

Process finished with exit code 0

swapaxes(p,q)(p和q是轴的编号)表示对换p和q轴,案例中表示对换1-轴和2-轴。

猜你喜欢

转载自blog.csdn.net/L_15156024189/article/details/84874310