在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的數組。我們想要對第二個維度進行轉置,也就是將每一個4×5的矩陣行列交換。因此,我們使用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]]]
我們可以看到,對第二個維度進行轉置後,每個4×5的矩陣行和列互換了位置。
三、水平和垂直反轉
除了使用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()函數創建了一個5×4的矩陣。接着,分別使用了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()函數和切片操作得到的結果是相同的。
原創文章,作者:QNOCG,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/362693.html