NumPy中數(shù)組的拼接(Concatenation)的使用
一、數(shù)組拼接的核心定義
數(shù)組拼接是指將多個形狀兼容的數(shù)組,沿著指定的軸(axis) 合并為一個新數(shù)組:
- 軸(axis):拼接的方向,二維數(shù)組中
axis=0表示按行拼接(垂直方向),axis=1表示按列拼接(水平方向); - 形狀兼容:除拼接軸外,其他維度的大小必須完全一致(比如按行拼接時,所有數(shù)組的列數(shù)必須相同);
- 核心函數(shù):
np.concatenate()(通用拼接)、np.vstack()(垂直拼接)、np.hstack()(水平拼接)、np.dstack()(深度拼接)。
二、核心拼接函數(shù)(分類講解)
NumPy 提供了多個拼接函數(shù),其中 np.concatenate() 是最通用的底層函數(shù),其他 vstack/hstack 是其簡化版(無需指定軸)。
1. 通用拼接:np.concatenate ()(核心)
語法:
np.concatenate((arr1, arr2, ...), axis=0, out=None)
(arr1, arr2, ...):待拼接的數(shù)組元組(必須用元組 / 列表包裹,不能直接傳多個數(shù)組);axis:拼接軸(默認(rèn)0),一維數(shù)組只能用axis=0;out:可選,指定輸出數(shù)組(一般不用);- 返回值:新數(shù)組(拼接后的結(jié)果,獨立內(nèi)存,不共享原數(shù)組數(shù)據(jù))。
示例 1:一維數(shù)組合并(最基礎(chǔ))
import numpy as np
# 兩個一維數(shù)組(模擬兩個班級的學(xué)生分?jǐn)?shù))
class1 = np.array([85, 92, 78, 90])
class2 = np.array([88, 76, 95, 81])
# 拼接為一個一維數(shù)組(axis=0,唯一可選)
all_scores = np.concatenate((class1, class2))
print("拼接后一維數(shù)組:", all_scores) # [85 92 78 90 88 76 95 81]
print("拼接后形狀:", all_scores.shape) # (8,)示例 2:二維數(shù)組按行拼接(axis=0)
按行拼接要求所有數(shù)組的列數(shù)相同(垂直方向堆疊):
import numpy as np
# 兩個二維數(shù)組(列數(shù)均為3)
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 2行3列
arr2 = np.array([[7, 8, 9], [10, 11, 12]]) # 2行3列
# 按行拼接(axis=0)→ 4行3列
arr_v = np.concatenate((arr1, arr2), axis=0)
print("按行拼接結(jié)果:\n", arr_v)
print("拼接后形狀:", arr_v.shape) # (4, 3)輸出:
按行拼接結(jié)果:
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
拼接后形狀: (4, 3)
示例 3:二維數(shù)組按列拼接(axis=1)
按列拼接要求所有數(shù)組的行數(shù)相同(水平方向拼接):
import numpy as np
# 兩個二維數(shù)組(行數(shù)均為2)
arr1 = np.array([[1, 2], [3, 4]]) # 2行2列
arr2 = np.array([[5, 6], [7, 8]]) # 2行2列
arr3 = np.array([[9], [10]]) # 2行1列
# 按列拼接(axis=1)→ 2行5列(2+2+1)
arr_h = np.concatenate((arr1, arr2, arr3), axis=1)
print("按列拼接結(jié)果:\n", arr_h)
print("拼接后形狀:", arr_h.shape) # (2, 5)輸出:
按列拼接結(jié)果:
[[ 1 2 5 6 9]
[ 3 4 7 8 10]]
拼接后形狀: (2, 5)
2. 簡化拼接函數(shù)(更直觀)
為了避免記錯 axis 參數(shù),NumPy 提供了更貼合語義的簡化函數(shù):
| 函數(shù) | 作用 | 等價于 | 適用場景 |
|---|---|---|---|
| np.vstack() | 垂直拼接(按行) | np.concatenate(..., axis=0) | 一維 / 二維數(shù)組按行堆疊 |
| np.hstack() | 水平拼接(按列) | np.concatenate(..., axis=1) | 一維 / 二維數(shù)組按列拼接 |
| np.dstack() | 深度拼接(按第三個維度) | np.concatenate(..., axis=2) | 三維數(shù)組拼接 |
示例:vstack/hstack 簡化操作
import numpy as np
# 二維數(shù)組
arr1 = np.array([[1,2],[3,4]])
arr2 = np.array([[5,6],[7,8]])
# 垂直拼接(等價于 axis=0)
arr_v = np.vstack((arr1, arr2))
print("vstack結(jié)果:\n", arr_v) # 4行2列
# 水平拼接(等價于 axis=1)
arr_h = np.hstack((arr1, arr2))
print("hstack結(jié)果:\n", arr_h) # 2行4列示例:一維數(shù)組的 hstack/vstack 特殊處理
一維數(shù)組用 hstack/vstack 會自動調(diào)整維度:
import numpy as np
a = np.array([1,2,3]) # 形狀(3,)
b = np.array([4,5,6]) # 形狀(3,)
# vstack:一維數(shù)組合并為二維(按行)→ (2,3)
v_arr = np.vstack((a, b))
print("vstack一維數(shù)組:\n", v_arr)
print("形狀:", v_arr.shape) # (2,3)
# hstack:一維數(shù)組合并為更長的一維 → (6,)
h_arr = np.hstack((a, b))
print("hstack一維數(shù)組:", h_arr)
print("形狀:", h_arr.shape) # (6,)3. 深度拼接:np.dstack ()(三維數(shù)組)
按第三個維度(深度)拼接,適用于圖像、三維數(shù)據(jù):
import numpy as np
# 兩個二維數(shù)組(形狀均為(2,3))
arr1 = np.array([[1,2,3],[4,5,6]])
arr2 = np.array([[7,8,9],[10,11,12]])
# 深度拼接 → 形狀(2,3,2)
d_arr = np.dstack((arr1, arr2))
print("dstack結(jié)果形狀:", d_arr.shape) # (2,3,2)
print("dstack結(jié)果[0,0,:]:", d_arr[0,0,:]) # [1,7](深度維度的兩個值)三、高維數(shù)組拼接(進(jìn)階)
高維數(shù)組拼接的核心是明確拼接軸的編號,維度編號從 0 開始:
- 三維數(shù)組形狀
(a,b,c)→ 軸 0=a、軸 1=b、軸 2=c; - 拼接時,除拼接軸外,其他維度大小必須一致。
示例:三維數(shù)組拼接
import numpy as np
# 兩個三維數(shù)組:形狀(2,3,4)(軸0=2,軸1=3,軸2=4)
arr1 = np.arange(24).reshape(2,3,4)
arr2 = np.arange(24,48).reshape(2,3,4)
# 按軸0拼接 → 形狀(4,3,4)
concat0 = np.concatenate((arr1, arr2), axis=0)
print("按軸0拼接形狀:", concat0.shape) # (4,3,4)
# 按軸1拼接 → 形狀(2,6,4)
concat1 = np.concatenate((arr1, arr2), axis=1)
print("按軸1拼接形狀:", concat1.shape) # (2,6,4)
# 按軸2拼接 → 形狀(2,3,8)
concat2 = np.concatenate((arr1, arr2), axis=2)
print("按軸2拼接形狀:", concat2.shape) # (2,3,8)四、拼接的兼容性規(guī)則(核心避坑?。?/h2>
拼接失敗的唯一原因是形狀不兼容,需牢記:
除拼接軸外,其他所有維度的大小必須完全一致。
示例:不兼容的拼接(報錯)
import numpy as np
# 錯誤1:按行拼接(axis=0)但列數(shù)不同
arr1 = np.array([[1,2],[3,4]]) # 2行2列
arr2 = np.array([[5,6,7],[8,9,10]]) # 2行3列
try:
np.concatenate((arr1, arr2), axis=0)
except ValueError as e:
print("報錯1:", e) # all the input array dimensions except for the concatenation axis must match exactly
# 錯誤2:按列拼接(axis=1)但行數(shù)不同
arr3 = np.array([[1,2],[3,4]]) # 2行2列
arr4 = np.array([[5,6]]) # 1行2列
try:
np.concatenate((arr3, arr4), axis=1)
except ValueError as e:
print("報錯2:", e)解決方法:調(diào)整數(shù)組形狀(reshape/expand_dims)
通過 reshape 或 np.expand_dims 讓數(shù)組形狀兼容:
import numpy as np
# 原數(shù)組:arr4是(1,2),行數(shù)為1(arr3行數(shù)為2,不兼容)
arr3 = np.array([[1,2],[3,4]])
arr4 = np.array([[5,6]])
# 方法1:給arr4添加一行(補0)
arr4_exp = np.vstack((arr4, [[0,0]])) # 變?yōu)?行2列
concat_ok = np.concatenate((arr3, arr4_exp), axis=1)
print("調(diào)整后拼接結(jié)果:\n", concat_ok)
# 方法2:擴(kuò)展維度(一維→二維)
a = np.array([1,2,3]) # (3,)
b = np.array([[4,5,6]]) # (1,3)
# 先將a轉(zhuǎn)為(1,3),再按行拼接
a_2d = np.expand_dims(a, axis=0) # (1,3)
concat_a_b = np.concatenate((a_2d, b), axis=0)
print("一維轉(zhuǎn)二維后拼接:\n", concat_a_b)五、常見應(yīng)用場景
場景 1:合并多組數(shù)據(jù)(機(jī)器學(xué)習(xí)數(shù)據(jù)集)
import numpy as np
# 模擬3組特征數(shù)據(jù)(每組10個樣本×5個特征)
feat1 = np.random.rand(10,5)
feat2 = np.random.rand(10,5)
feat3 = np.random.rand(10,5)
# 合并為30個樣本的數(shù)據(jù)集(按行拼接)
all_feat = np.concatenate((feat1, feat2, feat3), axis=0)
print("合并后數(shù)據(jù)集形狀:", all_feat.shape) # (30,5)
# 合并特征列(比如添加新特征)
new_feat = np.random.rand(30,1) # 30個樣本×1個新特征
all_feat_new = np.hstack((all_feat, new_feat))
print("添加新特征后形狀:", all_feat_new.shape) # (30,6)場景 2:合并時間序列數(shù)據(jù)(溫度數(shù)據(jù))
import numpy as np
# 模擬3月和4月的溫度數(shù)據(jù)(各31天×24小時)
march_temp = np.random.normal(5,6,(31,24)).round(1)
april_temp = np.random.normal(15,5,(30,24)).round(1)
# 合并為2個月的溫度數(shù)據(jù)(按行拼接,行數(shù)31+30=61)
spring_temp = np.vstack((march_temp, april_temp))
print("春季溫度數(shù)據(jù)形狀:", spring_temp.shape) # (61,24)場景 3:批量拼接多個數(shù)組
import numpy as np
# 生成10個一維數(shù)組,每個數(shù)組5個元素
arr_list = [np.random.randint(0,10,5) for _ in range(10)]
# 拼接為一個一維數(shù)組
all_arr = np.concatenate(arr_list, axis=0)
print("批量拼接后形狀:", all_arr.shape) # (50,)六、避坑點與最佳實踐
1. 核心避坑點
- ? 誤區(qū):直接傳多個數(shù)組給 concatenate(必須用元組 / 列表包裹,如 (arr1,arr2));
- ? 錯誤:一維數(shù)組用 axis=1 拼接(一維數(shù)組只有 axis=0,會報錯);
- ? 忽略:拼接軸的方向(二維數(shù)組 axis=0 是行,axis=1 是列,易記反);
- ? 混淆:vstack 對一維數(shù)組的處理(會轉(zhuǎn)為二維,而 concatenate 保持一維)。
2. 最佳實踐
- ? 簡單拼接用 vstack/hstack(語義清晰,無需記 axis);
- ? 高維數(shù)組用 np.concatenate(明確指定 axis);
- ? 拼接前檢查形狀:用 arr.shape 確認(rèn)除拼接軸外其他維度一致;
- ? 批量拼接多個數(shù)組時,先放入列表,再傳給 concatenate;
- ? 需頻繁拼接時,先預(yù)分配數(shù)組(np.empty)再填充,比多次拼接更高效。
總結(jié)
- NumPy 數(shù)組拼接的核心是 np.concatenate(),vstack/hstack 是簡化版(分別對應(yīng) axis=0/1);
- 拼接規(guī)則:除拼接軸外,其他維度大小必須完全一致,否則報錯;
- 維度說明:
- 一維數(shù)組:僅能按 axis=0 拼接(hstack 合并為更長一維,vstack 轉(zhuǎn)為二維);
- 二維數(shù)組:axis=0 按行拼接(列數(shù)一致),axis=1 按列拼接(行數(shù)一致);
- 避坑關(guān)鍵:拼接前檢查形狀兼容性,一維數(shù)組需轉(zhuǎn)二維時用 np.expand_dims;
- 常用場景:合并數(shù)據(jù)集、添加特征列、合并時間序列數(shù)據(jù)。
到此這篇關(guān)于NumPy中數(shù)組的拼接(Concatenation)的使用的文章就介紹到這了,更多相關(guān)NumPy 數(shù)組拼接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- NumPy 數(shù)組拼接與分割的使用詳解
- numpy中數(shù)組拼接、數(shù)組合并方法總結(jié)(append(),?concatenate,?hstack,?vstack,?column_stack,?row_stack,?np.r_,?np.c_等)
- numpy concatenate數(shù)組拼接方法示例介紹
- 詳解Numpy中的數(shù)組拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
- Python numpy實現(xiàn)二維數(shù)組和一維數(shù)組拼接的方法
- numpy 進(jìn)行數(shù)組拼接,分別在行和列上合并的實例
- numpy數(shù)組拼接簡單示例
相關(guān)文章
用Python把csv文件批量修改編碼為UTF-8格式并轉(zhuǎn)為Excel格式的方法
有時候用excel打開一個csv文件,中文全部顯示亂碼,然后手動用notepad++打開,修改編碼為utf-8并保存后,再用excel打開顯示正常,本文將給大家介紹一下用Python把csv文件批量修改編碼為UTF-8格式并轉(zhuǎn)為Excel格式的方法,需要的朋友可以參考下2023-09-09
Python使用django搭建web開發(fā)環(huán)境
這篇文章主要為大家詳細(xì)介紹了Python使用django搭建web開發(fā)環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Django之富文本(獲取內(nèi)容,設(shè)置內(nèi)容方式)
這篇文章主要介紹了Django之富文本(獲取內(nèi)容,設(shè)置內(nèi)容方式),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
bpython 功能強(qiáng)大的Python shell
bpython是一個不錯的Python解釋器的界面,本文帶著大家了解認(rèn)識一下bpython,感興趣的小伙伴們可以參考一下2016-02-02

