【Python】numpy.transpose对三维数组的转置

import numpy as np

三维数组

 

arr1 = np.arange(16).reshape((2, 2, 4))
#[[[ 0  1  2  3]
#  [ 4  5  6  7]]

#  [[ 8  9 10 11]
#  [12 13 14 15]]]

arr2=arr1.transpose((1,0,2))
#[[[ 0  1  2  3]
#  [ 8  9 10 11]]
#
# [[ 4  5  6  7]
#  [12 13 14 15]]]

正序为(0,1,2),数组为

 

 

#[[[ 0  1  2  3]
#  [ 4  5  6  7]]

#  [[ 8  9 10 11]
#  [12 13 14 15]]]

 

 

 

为什么进过tanspose(1,0,2),数组变为

 

#[[[ 0  1  2  3]
#  [ 8  9 10 11]]
#
# [[ 4  5  6  7]
#  [12 13 14 15]]]

仔细观察之后,可以看到转置后的数组和转置前的数组的区别就是第一页的第二行和第二页的第一行对换了,可是为什么?

 

当我用arr1[0,1,0],索引值为4

当我用arr2[1,0,0],索引值为4

 

对比索引参数表的变化和正序和转置序的不同似乎存在某种联系

 


对于arr1数组,索引参数表[0,0,x]可以表示第一页的第一行,当前两个参数对换之后,同一个元素的索引参数表并没有变化

故arr2的第一页第一行和arr1的第一页第一行相同

 

对于arr1数组,索引参数表[0,1,x]可以表示第一页第二行,当前两个参数对换之后,同一个元素的索引值比如[0,1,0]变为[1,0,0],

这就是解释了索引值4的索引参数表的不同

 

大概就是这个思路所以transpose(1,0,2),数组的第一页第二行和第二页第一行对换

后面的四种转置方式也大致是这个思路,仔细观察一下,理解起来应该不难

arr3=arr1.transpose((0,2,1))

# [[[ 0  4]
#  [ 1  5]
#  [ 2  6]
#  [ 3  7]]
#
#  [[ 8 12]
#  [ 9 13]
#  [10 14]
#  [11 15]]]

arr4=arr1.transpose((2,0,1))
#[[[ 0  4]
#  [ 8 12]]
#
# [[ 1  5]
#  [ 9 13]]
#
# [[ 2  6]
#  [10 14]]
#
# [[ 3  7]
#  [11 15]]]

这里要注意的是,arr4数组变成4页,这是因为页码和行码对换之后,

 

页码从数量2,变成了4

而行码从数量4,变成了2

 

arr5=arr1.transpose((2,1,0))
#[[[ 0  8]
#  [ 4 12]]
#
# [[ 1  9]
#  [ 5 13]]
#
# [[ 2 10]
#  [ 6 14]]
#
# [[ 3 11]
#  [ 7 15]]]

arr6=arr1.transpose((1,2,0))
#[[[ 0  8]
#  [ 1  9]
#  [ 2 10]
#  [ 3 11]]
#
# [[ 4 12]
#  [ 5 13]
#  [ 6 14]
#  [ 7 15]]]


另外,转置(2,0,1)可以看成,先转置(0,2,1)再转置(1,0,2)

 

转置(2,1,0)可以看成,先转置(1,0,2),然后转置(0,2,1),最后转置(1,0,2)

转置(1,2,0)可以看成,先转置(1,0,2),在转置(0,2,1)

代码可以写成

 

arr4=arr1.transpose(0,2,1).transpose(1,0,2)
#[[[ 0 4] # [ 8 12]] # # [[ 1 5] # [ 9 13]] # # [[ 2 6] # [10 14]] # # [[ 3 7] # [11 15]]]

 

 

结果一样
 

 

 

首先,我们可以使用NumPy库创建一个任意的三维数组。例如,使用`numpy.array`函数和一个三维列表来创建一个三维数组。接着,利用`numpy.transpose`函数或者数组对象的`.T`属性进行转置操作,这会改变数组度顺序。 一元通用函数,也称为一元ufunc,是指对单个数组进行操作的函数,例如`numpy.sqrt`计算平方根,`numpy.sin`计算正弦值等。在NumPy,一元ufunc可以应用于数组的每个元素上。 二元通用函数,也称为二元ufunc,是指对两个数组进行操作的函数,如`numpy.add`执行加法,`numpy.multiply`执行乘法等。二元ufunc需要两个相同度的数组作为输入,如果度不同,NumPy会尝试广播(broadcasting)较小的数组以匹配较大的数组度。 下面是一个具体的例子: ```python import numpy as np # 创建一个三维数组 arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]) # 对这个三维数组进行转置 transposed_arr = arr.transpose((2, 1, 0)) # 或者使用 arr.T # 选择一个一元通用函数进行处理,例如计算平方根 sqrt_arr = np.sqrt(transposed_arr) # 创建另一个三维数组 arr2 = np.array([[[13, 14], [15, 16]], [[17, 18], [19, 20]], [[21, 22], [23, 24]]]) # 选择一个二元通用函数进行计算,例如计算两个数组的加法 added_arr = np.add(arr, arr2) print("转置后的三维数组:\n", transposed_arr) print("计算平方根后的三维数组:\n", sqrt_arr) print("两个三维数组相加的结果:\n", added_arr) ``` 在这个例子,我们首先创建了一个3x2x2的三维数组`arr`,然后将其转置。之后,我们使用了一元通用函数`np.sqrt`来计算每个元素的平方根,并且创建了一个新的三维数组`arr2`与原数组`arr`进行加法运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值