您的位置:

如何快速反转Numpy数组

在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()函数和切片操作得到的结果是相同的。