在數據分析、科學計算以及機器學習中,經常需要將多個數組組合為一個整體。例如:
? 合并多個數據批次
? 按列拼接特征
? 按行堆疊樣本
? 構造高維張量或分塊矩陣
NumPy 提供了一組用于數組拼接與堆疊的函數。需要注意的是,這些操作均返回新數組,不會原地修改輸入數組。
按照功能劃分,NumPy 中常見的數組拼接與堆疊函數通常可以分為以下幾類:
(1)沿已有軸拼接
(2)沿新軸堆疊
(3)分塊拼接(結構拼接)
(4)按方向組織的便捷拼接接口
(5)列向量/行方向便捷接口
(6)簡化拼接接口
一、沿已有軸拼接
concatenate()
沿指定軸將多個數組連接起來。返回拼接后的新數組。
numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting='same_kind')參數說明:
? (a1, a2, ...):待拼接的數組序列(形狀需兼容)
? axis:拼接軸(默認 0)
? out:可選輸出數組
? dtype:目標數據類型
? casting:類型轉換規則
'unsafe':允許任意轉換(可能丟失信息)示例 1:按行拼接
np.concatenate((a, b), axis=0)輸出:
[5 6]]示例 2:按列拼接
np.concatenate((a, a), axis=1)輸出:
[3 4 3 4]]示例 3:展平拼接(axis=None)
np.concatenate((a, b), axis=None)輸出:
[1 2 3 4 5 6]當 axis=None 時,所有輸入數組會先被展平成一維數組,再進行拼接。
特別說明:
所有拼接函數的基礎形式是:除拼接軸外,其余維度必須一致。
二、沿新軸堆疊
stack()
在新軸上堆疊數組,從而構造更高維結構。返回堆疊后的新數組。
numpy.stack(arrays, axis=0)參數說明:
? arrays:數組序列(形狀必須完全一致)
? axis:新軸的位置
示例 1:
np.stack((a, b), axis=0) # 堆疊后數組的形狀為 (2, 3)輸出:
[4 5 6]]axis=0 表示在第 0 軸插入新維度。
示例 2:
np.stack((a, b), axis=1) # 堆疊后數組的形狀為 (3, 2, 1)輸出:
[6]]]axis=1 表示在第 1 軸插入新維度。
stack() 新增維度的尺寸與輸入數組的個數一致。
三、分塊拼接(結構拼接)
block()
按照嵌套列表結構,將多個數組拼接為一個整體數組。返回拼接后的新數組。
numpy.block(arrays)參數說明:
? arrays:嵌套列表(list of lists),用于描述拼接結構
示例 1:二維塊拼接
[C, A]])輸出:
[5 6 1 2]]該結構等價于分塊矩陣:
[C A]示例 2:構造塊對角矩陣
[Z, I]])輸出:
[0. 0. 0. 1.]]? 同一“行塊”中的數組必須在行數上兼容
? 同一“列塊”中的數組必須在列數上兼容
block() 本質上是對 concatenate() 的遞歸封裝。
四、按方向組織的便捷拼接接口
以下函數是對 concatenate() 的語義封裝。
vstack()
按行方向拼接數組(axis=0)。
numpy.vstack(tup)參數說明:
? tup:數組序列(由多個數組對象按順序組成的可迭代容器,可以是元組、列表或其它可迭代對象)
示例 1:
np.vstack((a, b)) # 拼接后數組的形狀為 (3, 2)輸出:
[5 6]]說明:一維數組會先轉為二維行向量。
示例 2:
np.vstack((a, b)) # 拼接后數組的形狀為 (3, 3)輸出:
[7 8 9]]vstack() 會先將一維輸入視為二維行向量,再沿第 0 軸拼接;對二維數組而言,可理解為等價于 concatenate(..., axis=0)。
hstack()
按列方向拼接數組。
numpy.hstack(tup)示例:
np.hstack((a, b)) # 拼接后數組的形狀為 (2, 3)輸出:
[3 4 6]]對二維及更高維數組,hstack() 等價于沿 axis=1 調用 concatenate();對于一維數組,它等價于沿 axis=0 進行拼接。
dstack()
沿第三軸拼接數組。
numpy.dstack(tup)示例:
d = np.dstack((a, b, c)) # d.shape 為 (2, 4, 3)輸出:
[ 8 80 800]]]dstack() 會先將輸入調整為至少三維,再沿第三個軸(axis=2)進行拼接。對于二維輸入,可理解為在結果中形成“深度”方向的組合。
五、列向量/行方向便捷接口
column_stack()
按列堆疊數組。
numpy.column_stack(tup)參數說明:
? tup:數組序列
示例 1:
np.column_stack((a, b))輸出:
[3 6]]說明:一維數組會被視為列向量。
示例 2:
np.column_stack((a, b))輸出:
[3 6]]column_stack() 要求數組的第一維長度一致。對于二維輸入,它的效果可理解為按列執行 hstack();對于一維輸入,會先將每個輸入視為列向量,再進行橫向拼接。
row_stack()
按行堆疊數組。
numpy.row_stack(tup)示例:
np.row_stack((a, b))輸出:
[4 5 6]]row_stack() 的行為與 vstack() 一致,通常可視為其等價接口。在實際使用中,vstack() 更常見。
六、簡化拼接接口
append()
在數組末尾追加元素。總是返回數組副本(copy)。
numpy.append(arr, values, axis=None)參數說明:
? arr:輸入數組
? values:追加的數據
? axis:拼接軸
示例 1:
np.append(a, 4)輸出:
[1 2 3 4]說明:在數組末尾添加新元素。
示例 2:二維數組(指定軸)
np.append(a, b, axis=0)輸出:
[5 6]]示例 3:axis=None(展平后追加)
np.append(a, [5, 6])輸出:
[1 2 3 4 5 6]? append() 本質是 concatenate() 的簡化形式
? 當 axis=None 時,會先將數組展平后再拼接
? append() 不會原地擴展原數組,而是返回拼接后的新數組
小結
NumPy 提供了一套完整的數組拼接與堆疊機制,其中 concatenate() 用于沿已有軸拼接,stack() 用于創建新維度,block() 用于構造分塊結構,而 vstack()、hstack()、column_stack() 等函數則提供了更高層的語義封裝。需要特別注意,不同函數在是否新增維度、輸入形狀要求以及一維數組處理方式方面存在差異,在實際應用中應根據數據結構與計算目標合理選擇。
![]()
“點贊有美意,贊賞是鼓勵”
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.