在Numpy中,对于一些二维和多维数组,在进行数据分析和模型训练的时候,常常需要将其反转,但是如果采用循环的方式实现数组的转置是非常耗费时间的,本文将会介绍如何利用Numpy的内置函数,快速反转Numpy数组。
一、矩阵的转置
Numpy中提供了transpose()函数和T属性,用于矩阵的转置。transpose()函数和T属性的效果是相同的,将矩阵的行和列交换。
import numpy as np
# 创建一个3行5列的矩阵
arr = np.arange(15).reshape((3,5))
print("原始矩阵:")
print(arr)
# 矩阵转置
transpose_arr1 = arr.transpose() # 使用transpose()函数
transpose_arr2 = arr.T # 使用T属性
print("转置后的矩阵1:")
print(transpose_arr1)
print("转置后的矩阵2:")
print(transpose_arr2)
代码解析:
首先,我们导入了Numpy库,并利用arange()和reshape()函数创建了一个3行5列的矩阵。接着,分别使用了transpose()函数和T属性对矩阵进行转置操作,并将结果打印出来。
执行结果如下:
原始矩阵:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
转置后的矩阵1:
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
转置后的矩阵2:
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
我们可以看到,经过转置操作后,原始矩阵的行和列进行了交换,并且使用transpose()函数和T属性得到的结果是相同的。
二、多维数组的转置
对于多维数组,如果需要对指定的维度进行转置,则需要使用到transpose()函数的另外一个参数——axes。通过传递一组轴编号,轴的顺序将被重新排列。
import numpy as np
# 创建一个3x4x5的多维数组
arr = np.arange(60).reshape((3,4,5))
print("原始数组:")
print(arr)
# 对指定维度进行转置
transpose_arr = np.transpose(arr, (0,2,1))
print("转置后的数组:")
print(transpose_arr)
代码解析:
首先,我们导入了Numpy库,并利用arange()和reshape()函数创建了一个3x4x5的数组。我们想要对第二个维度进行转置,也就是将每一个4x5的矩阵行列交换。因此,我们使用np.transpose()函数,并在第二个参数中传入一个轴编号的元组(0,2,1)。这个元组指明了我们想要怎么重新排序轴。
执行结果如下:
原始数组:
[[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[[20 21 22 23 24]
[25 26 27 28 29]
[30 31 32 33 34]
[35 36 37 38 39]]
[[40 41 42 43 44]
[45 46 47 48 49]
[50 51 52 53 54]
[55 56 57 58 59]]]
转置后的数组:
[[[ 0 5 10 15]
[ 1 6 11 16]
[ 2 7 12 17]
[ 3 8 13 18]
[ 4 9 14 19]]
[[20 25 30 35]
[21 26 31 36]
[22 27 32 37]
[23 28 33 38]
[24 29 34 39]]
[[40 45 50 55]
[41 46 51 56]
[42 47 52 57]
[43 48 53 58]
[44 49 54 59]]]
我们可以看到,对第二个维度进行转置后,每个4x5的矩阵行和列互换了位置。
三、水平和垂直反转
除了使用transpose()函数实现数组的转置之外,Numpy还提供了flip()函数和flipud()函数,用于对数组进行水平和垂直反转。其中flip()函数对所有维度上的元素进行反转,而flipud()函数则只对第一个维度上的元素进行反转。
import numpy as np
# 创建一个5x4的矩阵
arr = np.arange(20).reshape((5,4))
print("原始矩阵:")
print(arr)
# 水平反转
flip_arr1 = np.fliplr(arr) # 使用fliplr()函数
flip_arr2 = arr[:, ::-1] # 使用切片操作
# 垂直反转
flip_arr3 = np.flipud(arr) # 使用flipud()函数
flip_arr4 = arr[::-1, :] # 使用切片操作
print("水平反转后的矩阵1:")
print(flip_arr1)
print("水平反转后的矩阵2:")
print(flip_arr2)
print("垂直反转后的矩阵1:")
print(flip_arr3)
print("垂直反转后的矩阵2:")
print(flip_arr4)
代码解析:
首先,我们导入了Numpy库,并利用arange()和reshape()函数创建了一个5x4的矩阵。接着,分别使用了fliplr()函数、flipud()函数和切片操作,对矩阵进行了水平和垂直反转,并将结果打印出来。
执行结果如下:
原始矩阵:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
水平反转后的矩阵1:
array([[ 3, 2, 1, 0],
[ 7, 6, 5, 4],
[11, 10, 9, 8],
[15, 14, 13, 12],
[19, 18, 17, 16]])
水平反转后的矩阵2:
array([[ 3, 2, 1, 0],
[ 7, 6, 5, 4],
[11, 10, 9, 8],
[15, 14, 13, 12],
[19, 18, 17, 16]])
垂直反转后的矩阵1:
array([[16, 17, 18, 19],
[12, 13, 14, 15],
[ 8, 9, 10, 11],
[ 4, 5, 6, 7],
[ 0, 1, 2, 3]])
垂直反转后的矩阵2:
array([[16, 17, 18, 19],
[12, 13, 14, 15],
[ 8, 9, 10, 11],
[ 4, 5, 6, 7],
[ 0, 1, 2, 3]])
我们可以看到,对原始矩阵进行水平和垂直反转后,结果分别和使用fliplr()函数、flipud()函数和切片操作得到的结果是相同的。