numpy之np.transpose()函数和多维数组的详细讲解

本文深入浅出地解析了np.transpose函数在处理一维、二维及三维数组转置的应用,通过实例详细阐述了不同维度数组的转置原理及索引变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

np.transpose炒鸡详细的讲解,如果看本文之前你不懂,看完你绝对能懂,你值得拥有
一个电脑小白的自我成长之路*_&

np.transpose()函数是用来处理数组转置问题的

一维数组,通常我的理解就是和python中列表差不多,

li = [i for i in range(10)]
print(li)        # 输出的结果是  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]`

二维数值,等同于矩阵。栗子如下:

arr2 = np.arange(12).reshape(3, 4)
print(arr2)    #  [[ 0  1  2  3]
#                 [ 4  5  6  7]
#                 [ 8  9 10 11]]

np.arange(12)表示数值的数从0-11共12 个数,reshape(3,4)表示定义一个二维数值,行数是3列数为4,即3*4三行四列。用np.transpose()函数进行转置,行列转换后的结果为一个4行3列的结果,为:


tran_arr2 = np.transpose(arr2)
print(tran_arr2)   #   [[ 0  4  8]
 #                     [ 1  5  9]
 #                     [ 2  6 10]
 #                     [ 3  7 11]] 

原二维数组arr2的第一列的三个数0, 4, 8转换成了tran_arr2的第一行[0, 4, 8]。从矩阵层面理解的话trans_arr2也就是原数组arr的转置矩阵。
arr2[0, 0] = 0,中括号里可以理解为平面坐标位置[0 , 0] ,行理解为横坐标,列理解为纵坐标,即第一行第一列第一个数(为啥是第一行第一列,因为计算机是从0开始计数的),那arr2[2,3]是不是理解为位置是[2,3]的数,也就是第三行第四列的数,即11,看这样理解你就对啦。
二维数值的索引比较好理解,行是0,列是1.

#原数组
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
 #转置后数组
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]

三维数组,arr3[d, h, w]有三个维度分别为深,高,宽,[d, h, w]可以理解为空间三维坐标x, z ,y 栗子如下:

# arr3[0, 0, 0] = 0, arr3[0, 0, 1] = 1, arr3[0, 0, 2] = 2, arr3[0, 1, 0] = 3,
# arr3[0, 1, 1] = 4, arr3[0, 1, 2] = 5, arr3[1, 0, 0] = 6,arr3[1, 0, 1] = 7
# arr3[1, 0, 2] = 8, arr3[1, 1, 0] = 9, arr3[1, 1, 1] = 10,arr3[1, 0, 1] = 11
arr3 = np.arange(12).reshape(2, 2, 3)
for d in range(2):
    for h in range(2):
        for w in range(3):
            print(arr3[d, h , w])     # d也就是三维第一个参数表示深度,h也是第二个参数表示高,
                                      # w也是宽度第三个参数
print(arr3[1, 0, 0])                  # 结果为6

循环打印的结果很明显就是0,1,2,3,4,5,6,7,8,9,10,11啦。arr3为223的三维数组。输出arr3 的结果如下:
arr3[1, 0, 0]表示的是深度为2,高为1,宽为1的数,即坐标位置为[1, 0, 0]的数就是6,如果你问arr3[0 , 1, 1],那就是4啦。
对着代码画个,空间坐标系然后就明白啦。
接着,就是理解一下索引啦,三维数组的索引d对应0,h对应1,w对应2。
在这里插入图片描述
即深度是2,索引号0;高度为2,索引号是1;宽度是3,索引号是2.
再来理解np.transpose()函数是怎么将三维数组转换的。

tran_arr3 = np.transpose(arr3, (1, 0, 2))   # 即深索引本身是0的数,用索引为1的高的数代替了,
                                            # 高的索引本身是1,用索引为0 的深的数换了
print(tran_arr3)           #  [[[ 0  1  2]
                           #   [ 6  7  8]]
                           
                           #   [[ 3  4  5]
                           #  [ 9 10 11]]]

np.transpose(arr3, (1, 0 ,2))的意思就深和高对换,宽位置不变。即数组中arr3[0,1,0] =3 和arr3[1,0,0] = 6对换,arr3[0 ,1 ,1]为4的数和arr3[1, 0 ,1]为7的数对调,arr3[0, 1, 2]的数5和arr3[1, 0, 2]为8的数对换。所以,输出tran_arr3的结果如上面代码的结果。犹如深和高都是2,直接互换就可以啦。如果不一样,又该怎么样呢?如果深和宽互换,代码如下:

tran1_arr3 = np.transpose(arr3, (2, 1, 0))
print(tran1_arr3)

tran1_arr3 = np.transpose(arr3, (2, 1, 0)) 现在是深为2 ,宽为3进行互换,高不变。我们先猜猜结果,肯定是3*2**2的三维数组,即深度为3,高和宽是2的数组。结果到底怎么样呢?

#原数组,arr3
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
 #arr[1, 0, 0]结果
6
# tran_arr3 = np.transpose(arr3, (1, 0, 2))深与高转换的数组,仍然是2*2*3的数组
[[[ 0  1  2]
  [ 6  7  8]]

 [[ 3  4  5]
  [ 9 10 11]]]
# tran1_arr3 = np.transpose(arr3, (2, 1, 0)) 深与宽转换后的数组,变成3*2*3的数组了
[[[ 0  6]
  [ 3  9]]

 [[ 1  7]
  [ 4 10]]

 [[ 2  8]
  [ 5 11]]]

具体的转换过程是这样的:
在这里插入图片描述
将其写成三维数组为:

####
[[[坐标为(000)的数0,坐标为(001)的数6]
  [坐标为(010)的数3,坐标为(011)的数9]]
 [[坐标为(100)的数1,坐标为(101)的数7]
  [坐标为(110)的数4,坐标为(111)的数10]]
 [[坐标为(200)的数2,坐标为(201)的数8]
  [坐标为(210)的数5,坐标为(211)的数11]]][ [[0,6]
      [3,9]]
     [[1,7]
      [4,10]]
     [[2,8]
      [5,11]]]

够详细吗?按照我的思路,写一遍或者走一遍就能简单理解啦

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值