NumPy中數(shù)組的轉(zhuǎn)置Transpose的三種方法
一、數(shù)組轉(zhuǎn)置的核心定義
轉(zhuǎn)置是指調(diào)整數(shù)組維度的順序,并重新排列元素的存儲(chǔ)位置:
- 對(duì)二維數(shù)組(矩陣):轉(zhuǎn)置就是 “行變列、列變行”(最直觀的場(chǎng)景);
- 對(duì)高維數(shù)組(三維 / 四維):轉(zhuǎn)置是按指定順序重新排列維度(比如將 (維度0, 維度1, 維度2) 轉(zhuǎn)為 (維度2, 維度1, 維度0))。
NumPy 中實(shí)現(xiàn)轉(zhuǎn)置的核心方式有 3 種(等價(jià)但適用場(chǎng)景不同):
| 方式 | 語(yǔ)法 | 特點(diǎn) |
|---|---|---|
| 數(shù)組屬性 T | arr.T | 最簡(jiǎn)潔,適合二維數(shù)組快速轉(zhuǎn)置 |
| 方法 transpose() | arr.transpose(axes) | 靈活,可指定高維數(shù)組的維度順序 |
| 函數(shù) np.transpose() | np.transpose(arr, axes) | 等價(jià)于 arr.transpose(),函數(shù)式寫法 |
二、基礎(chǔ)用法:二維數(shù)組轉(zhuǎn)置(最常用)
二維數(shù)組轉(zhuǎn)置是日常開發(fā)中最常見的場(chǎng)景,對(duì)應(yīng)數(shù)學(xué)中的 “矩陣轉(zhuǎn)置”。
示例 1:用arr.T快速轉(zhuǎn)置(推薦)
import numpy as np
# 原始二維數(shù)組(2行3列)
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print("原始數(shù)組:\n", arr_2d)
print("原始形狀:", arr_2d.shape) # (2, 3)
# 轉(zhuǎn)置(行變列、列變行)
arr_T = arr_2d.T
print("\n轉(zhuǎn)置后數(shù)組:\n", arr_T)
print("轉(zhuǎn)置后形狀:", arr_T.shape) # (3, 2)輸出結(jié)果:
原始數(shù)組:
[[1 2 3]
[4 5 6]]
原始形狀: (2, 3)
轉(zhuǎn)置后數(shù)組:
[[1 4]
[2 5]
[3 6]]
轉(zhuǎn)置后形狀: (3, 2)
示例 2:用transpose()轉(zhuǎn)置(等價(jià)于T)
# 二維數(shù)組轉(zhuǎn)置時(shí),transpose() 無(wú)參數(shù)等價(jià)于 arr.T
arr_trans = arr_2d.transpose()
print("transpose() 轉(zhuǎn)置結(jié)果:\n", arr_trans) # 和 arr.T 完全一致三、進(jìn)階用法:高維數(shù)組轉(zhuǎn)置(核心是維度順序)
高維數(shù)組(三維 / 四維)的轉(zhuǎn)置不再是簡(jiǎn)單的 “行變列”,而是按指定的維度順序重新排列,這是新手最易混淆的點(diǎn)。
先明確:高維數(shù)組的維度編號(hào)
NumPy 數(shù)組的維度從 0 開始編號(hào),比如:
- 三維數(shù)組形狀
(2, 3, 4)→ 維度 0=2、維度 1=3、維度 2=4; - 可理解為:
(樣本數(shù), 行數(shù), 列數(shù))或(通道數(shù), 高度, 寬度)(圖像場(chǎng)景)。
示例 1:三維數(shù)組轉(zhuǎn)置(默認(rèn)順序)
transpose() 無(wú)參數(shù)時(shí),高維數(shù)組會(huì)反轉(zhuǎn)維度順序(比如 (0,1,2) → (2,1,0)):
import numpy as np
# 原始三維數(shù)組:形狀 (2, 3, 4) → 維度0=2,維度1=3,維度2=4
arr_3d = np.arange(24).reshape(2, 3, 4)
print("原始三維數(shù)組:\n", arr_3d)
print("原始形狀:", arr_3d.shape) # (2, 3, 4)
# 無(wú)參數(shù)轉(zhuǎn)置:維度順序反轉(zhuǎn) (2,1,0) → 形狀 (4, 3, 2)
arr_3d_T = arr_3d.transpose()
print("\n轉(zhuǎn)置后形狀:", arr_3d_T.shape) # (4, 3, 2)示例 2:指定維度順序轉(zhuǎn)置(核心?。?/h3>
通過 transpose(axes) 參數(shù)指定維度順序,實(shí)現(xiàn)靈活的維度調(diào)整:
import numpy as np
arr_3d = np.arange(24).reshape(2, 3, 4) # 維度0=2,維度1=3,維度2=4
# 需求:將維度順序改為 (1, 0, 2) → 形狀 (3, 2, 4)
arr_3d_trans1 = arr_3d.transpose(1, 0, 2)
print("維度順序 (1,0,2) → 形狀:", arr_3d_trans1.shape) # (3, 2, 4)
# 需求:將維度順序改為 (0, 2, 1) → 形狀 (2, 4, 3)
arr_3d_trans2 = arr_3d.transpose(0, 2, 1)
print("維度順序 (0,2,1) → 形狀:", arr_3d_trans2.shape) # (2, 4, 3)實(shí)戰(zhàn)場(chǎng)景:圖像數(shù)據(jù)轉(zhuǎn)置(計(jì)算機(jī)視覺)
圖像數(shù)據(jù)常見維度順序有兩種:
(高度, 寬度, 通道)(HWC,如 PIL/OpenCV);(通道, 高度, 寬度)(CHW,如 PyTorch)。
轉(zhuǎn)置可快速切換這兩種格式:
import numpy as np
# 模擬圖像數(shù)據(jù):2張圖片 × 32高度 × 32寬度 × 3通道(HWC格式,形狀 (2,32,32,3))
img_hwc = np.random.randint(0, 255, (2, 32, 32, 3))
print("HWC格式形狀:", img_hwc.shape) # (2, 32, 32, 3)
# 轉(zhuǎn)置為CHW格式:維度順序 (0, 3, 1, 2) → 形狀 (2, 3, 32, 32)
img_chw = img_hwc.transpose(0, 3, 1, 2)
print("CHW格式形狀:", img_chw.shape) # (2, 3, 32, 32)四、轉(zhuǎn)置的核心特性:視圖(共享內(nèi)存)
和 reshape(-1) 類似,轉(zhuǎn)置返回的是原數(shù)組的視圖(View),而非新數(shù)組 —— 修改轉(zhuǎn)置后的數(shù)組,會(huì)同步修改原數(shù)組(核心避坑點(diǎn)?。?。
示例:驗(yàn)證共享內(nèi)存
import numpy as np
arr = np.array([[1, 2], [3, 4]])
arr_T = arr.T # 轉(zhuǎn)置視圖
# 修改轉(zhuǎn)置后的數(shù)組
arr_T[0, 1] = 99
print("轉(zhuǎn)置數(shù)組修改后:\n", arr_T)
print("原數(shù)組同步修改:\n", arr) # 原數(shù)組的 [1,1] 位置變?yōu)?9輸出結(jié)果:
轉(zhuǎn)置數(shù)組修改后:
[[ 1 99]
[ 2 4]]
原數(shù)組同步修改:
[[ 1 2]
[99 4]]
解決方法:若需要獨(dú)立的轉(zhuǎn)置數(shù)組,添加 .copy():
arr_T_indep = arr.T.copy()
arr_T_indep[0,1] = 0
print("獨(dú)立轉(zhuǎn)置數(shù)組修改后,原數(shù)組:\n", arr) # 原數(shù)組不變五、轉(zhuǎn)置的常見應(yīng)用場(chǎng)景
場(chǎng)景 1:矩陣運(yùn)算(線性代數(shù))
矩陣乘法要求 “第一個(gè)矩陣的列數(shù) = 第二個(gè)矩陣的行數(shù)”,轉(zhuǎn)置是調(diào)整維度的關(guān)鍵:
import numpy as np
# 矩陣A:2行3列
A = np.array([[1,2,3], [4,5,6]])
# 矩陣B:3行2列(A的轉(zhuǎn)置)
B = A.T
# 矩陣乘法:A × B → 2行2列
C = np.dot(A, B)
print("A × A.T 的結(jié)果:\n", C)場(chǎng)景 2:數(shù)據(jù)按列 / 行統(tǒng)計(jì)
轉(zhuǎn)置可將 “按行存儲(chǔ)” 的數(shù)據(jù)轉(zhuǎn)為 “按列存儲(chǔ)”,方便統(tǒng)計(jì):
import numpy as np
# 原始數(shù)據(jù):31天×24小時(shí)溫度(按行存儲(chǔ),每行是1天)
temp = np.random.normal(5, 6, (31, 24)).round(1)
# 需求:統(tǒng)計(jì)每小時(shí)的平均溫度(按列統(tǒng)計(jì))
# 方法1:直接按列統(tǒng)計(jì)
hour_mean1 = temp.mean(axis=0)
# 方法2:轉(zhuǎn)置后按行統(tǒng)計(jì)(等價(jià))
hour_mean2 = temp.T.mean(axis=1)
print("每小時(shí)平均溫度(方法1):", hour_mean1[:5])
print("每小時(shí)平均溫度(方法2):", hour_mean2[:5]) # 結(jié)果一致場(chǎng)景 3:廣播配合轉(zhuǎn)置
轉(zhuǎn)置可調(diào)整數(shù)組形狀,讓廣播更靈活:
import numpy as np
# 數(shù)組A:2行3列
A = np.array([[1,2,3], [4,5,6]])
# 數(shù)組B:2個(gè)元素(想按列和A相加)
B = np.array([10, 20])
# 直接相加:B會(huì)被廣播為(2,1),和A的(2,3)相加 → 每行加對(duì)應(yīng)值
# 需求:每列加對(duì)應(yīng)值 → 先轉(zhuǎn)置A,相加后再轉(zhuǎn)置
A_T = A.T + B # A.T是(3,2),B是(2,) → 廣播為(3,2),逐行相加
A_new = A_T.T
print("每列加對(duì)應(yīng)值的結(jié)果:\n", A_new)輸出結(jié)果:
每列加對(duì)應(yīng)值的結(jié)果:
[[11 12 13]
[24 25 26]]
六、避坑點(diǎn)與最佳實(shí)踐
1. 核心避坑點(diǎn)
- ? 誤區(qū):轉(zhuǎn)置會(huì)創(chuàng)建新數(shù)組(實(shí)際是視圖,共享內(nèi)存,需獨(dú)立則加 .copy());
- ? 誤區(qū):高維數(shù)組轉(zhuǎn)置無(wú)參數(shù)時(shí)和二維一樣(實(shí)際是反轉(zhuǎn)維度順序);
- ? 錯(cuò)誤:指定無(wú)效的維度順序(如三維數(shù)組指定 transpose(3,1,2),維度編號(hào)超出范圍);
- ? 混淆:轉(zhuǎn)置和 reshape(轉(zhuǎn)置改變?cè)嘏帕?,reshape 僅改變形狀,元素順序不變)。
2. 最佳實(shí)踐
- ? 二維數(shù)組轉(zhuǎn)置優(yōu)先用 arr.T(簡(jiǎn)潔高效);
- ? 高維數(shù)組轉(zhuǎn)置明確維度順序(如 transpose(0,3,1,2)),避免依賴默認(rèn)反轉(zhuǎn);
- ? 需獨(dú)立數(shù)組時(shí),轉(zhuǎn)置后加 .copy();
- ? 驗(yàn)證轉(zhuǎn)置結(jié)果:通過 shape 屬性檢查維度是否符合預(yù)期。
總結(jié)
- 數(shù)組轉(zhuǎn)置核心是調(diào)整維度順序:二維數(shù)組是 “行變列”,高維數(shù)組是按指定順序重排維度;
- 實(shí)現(xiàn)方式:arr.T(二維首選)、arr.transpose(axes)(高維靈活)、np.transpose()(函數(shù)式);
- 核心特性:轉(zhuǎn)置返回視圖(共享內(nèi)存),修改會(huì)同步影響原數(shù)組,需獨(dú)立則加 .copy();
- 常用場(chǎng)景:矩陣運(yùn)算、圖像格式轉(zhuǎn)換、廣播配合調(diào)整維度、按列 / 行統(tǒng)計(jì)數(shù)據(jù);
- 避坑關(guān)鍵:區(qū)分轉(zhuǎn)置和 reshape,高維轉(zhuǎn)置明確維度順序,驗(yàn)證形狀是否符合預(yù)期。
到此這篇關(guān)于NumPy中數(shù)組的轉(zhuǎn)置Transpose的三種方法的文章就介紹到這了,更多相關(guān)NumPy數(shù)組轉(zhuǎn)置Transpose內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sklearn中的交叉驗(yàn)證的實(shí)現(xiàn)(Cross-Validation)
這篇文章主要介紹了sklearn中的交叉驗(yàn)證的實(shí)現(xiàn)(Cross-Validation),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
python統(tǒng)計(jì)文本文件內(nèi)單詞數(shù)量的方法
這篇文章主要介紹了python統(tǒng)計(jì)文本文件內(nèi)單詞數(shù)量的方法,涉及Python針對(duì)文本文件及字符串的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05
基于OpenCV實(shí)現(xiàn)動(dòng)態(tài)畫矩形和多邊形并保存坐標(biāo)
這篇文章主要為大家詳細(xì)介紹了如何利用OpenCV實(shí)現(xiàn)動(dòng)態(tài)畫矩形和多邊形并保存坐標(biāo),文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以參考一下2023-03-03
Python環(huán)境隔離實(shí)戰(zhàn)之venv/virtualenv與conda的差異與最佳實(shí)踐
Python虛擬環(huán)境到底是什么,它如何隔離依賴并工作,在實(shí)際開發(fā)中,我們?cè)撊绾蝿?chuàng)建、使用和切換環(huán)境,以避免版本沖突,下面小編就帶大家深入了解一下吧2025-08-08
Python連接和操作Elasticsearch的詳細(xì)指南
Elasticsearch 是一個(gè)強(qiáng)大的搜索引擎,廣泛應(yīng)用于數(shù)據(jù)存儲(chǔ)和搜索場(chǎng)景,通過 Python,我們可以方便地與 Elasticsearch 進(jìn)行交互,本文將詳細(xì)介紹如何在本地使用 Python 連接到服務(wù)器上的 Elasticsearch,并進(jìn)行基本的操作,需要的朋友可以參考下2024-12-12
python pygame實(shí)現(xiàn)五子棋小游戲
這篇文章主要為大家詳細(xì)介紹了python pygame實(shí)現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06

