NumPy 数组拼接与分割的使用详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、数组拼接(Concatenation)</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1. 核心函数</a></li><li><a href="#_lab2_0_1">2. 代码示例</a></li></ul><li><a href="#_label1">二、数组分割(Splitting)</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">1. 核心函数</a></li><li><a href="#_lab2_1_3">2. 代码示例</a></li></ul><li><a href="#_label2">三、内存与性能</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_4">1. 拼接后的数组为新对象</a></li><li><a href="#_lab2_2_5">2. 分割后的子数组为视图</a></li></ul><li><a href="#_label3">四、实用场景</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_6">1. 数据集合并</a></li><li><a href="#_lab2_3_7">2. 图像分块处理</a></li><li><a href="#_lab2_3_8">3. 特征与标签分离</a></li></ul><li><a href="#_label4">五、错误处理</a></li><ul class="second_class_ul"></ul></ul></div><p><code>NumPy</code> 提供了多种方法用于数组<strong>拼接(Concatenation)</strong>和<strong>分割(Splitting)</strong>,这些操作在数据预处理、特征工程和结果整合中至关重要。</p><p class="maodian"><a name="_label0"></a></p><h2>一、数组拼接(Concatenation)</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1. 核心函数</h3>
<table><thead><tr><th>函数</th><th>用途</th><th>适用场景</th></tr></thead><tbody><tr><td><code>np.concatenate()</code></td><td>沿指定轴拼接多个数组</td><td>通用拼接(需数组维度一致)</td></tr><tr><td><code>np.vstack()</code></td><td>垂直(按行)拼接</td><td>二维数组的行叠加</td></tr><tr><td><code>np.hstack()</code></td><td>水平(按列)拼接</td><td>二维数组的列叠加</td></tr><tr><td><code>np.stack()</code></td><td>沿新轴堆叠数组</td><td>增加新维度(如通道维度)</td></tr></tbody></table>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2. 代码示例</h3>
<ul><li><code>np.concatenate</code></li></ul>
<div class="jb51code"><pre class="brush:py;">import numpy as np
a = np.array([, ])# shape (2,2)
b = np.array([]) # shape (1,2)
# 沿轴0(行方向)拼接
c = np.concatenate((a, b), axis=0)
print(c)
# 输出:
# [
#
#]
</pre></div>
<ul><li><code>np.vstack</code> 和 <code>np.hstack</code></li></ul>
<div class="jb51code"><pre class="brush:py;"># 垂直拼接(等效于 concatenate(axis=0)
v_combined = np.vstack()# 结果同上
# 水平拼接(要求行数相同)
d = np.array([, ]) # shape (2,1)
h_combined = np.hstack()
print(h_combined)
# 输出:
# [
#]
</pre></div>
<ul><li><code>np.stack</code> 增加新维度</li></ul>
<div class="jb51code"><pre class="brush:py;">x = np.array()
y = np.array()
# 沿新轴0堆叠(创建三维数组)
stacked = np.stack(, axis=0)# shape (2,3)
print(stacked)
# 输出:
# [
#]
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>二、数组分割(Splitting)</h2>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>1. 核心函数</h3>
<p>|函数 |用途 |适用场景|<br />|<code>np.split()</code> |沿指定轴均匀分割数组 |等分数组(需可整除)|<br />|<code>np.vsplit()</code> |垂直分割(按行) |二维数组的行分割|<br />|<code>np.hsplit()</code> |水平分割(按列) |二维数组的列分割|<br />|<code>np.array_split()</code> |支持不均匀分割 |处理无法整除的情况|</p>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2. 代码示例</h3>
<ul><li><code>np.split</code> 均匀分割</li></ul>
<div class="jb51code"><pre class="brush:py;">arr = np.arange(9).reshape(3, 3)# [, , ]
# 沿轴0分割为3个子数组(每行一个)
sub_arrays = np.split(arr, 3, axis=0)
# 结果: ]), array([]), array([])]
</pre></div>
<ul><li><code>np.array_split</code> 不均匀分割</li></ul>
<div class="jb51code"><pre class="brush:py;"># 将6个元素分割为4个子数组(允许不等分)
arr = np.arange(6)#
subs = np.array_split(arr, 4)
# 结果: ), array(), array(), array()]
subs
</pre></div>
<ul><li><code>np.hsplit</code> 按列分割</li></ul>
<div class="jb51code"><pre class="brush:py;">matrix = np.array([, ])
# 在第2列和第3列间分割
split_cols = np.hsplit(matrix, )
# 结果:
# , ]),
#array([, ])]
split_cols
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、内存与性能</h2>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>1. 拼接后的数组为新对象</h3>
<ul><li>拼接操作<strong>始终生成新数组</strong>(原数据不受影响)</li><li>内存占用较高(需存储拼接后的完整数据)</li></ul>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>2. 分割后的子数组为视图</h3>
<ul><li>split() 返回的是<strong>原数组的视图</strong>(共享内存)</li><li>修改子数组会影响原数据</li></ul>
<div class="jb51code"><pre class="brush:py;">arr = np.arange(9).reshape(3, 3)
sub_arrays = np.split(arr, 3, axis=0)
sub_arrays = 100
print(sub_arrays)# 输出: ]), array([]), array([])]
print(arr)# 输出: 100 → 原数组被修改!
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>四、实用场景</h2>
<p class="maodian"><a name="_lab2_3_6"></a></p><h3>1. 数据集合并</h3>
<div class="jb51code"><pre class="brush:py;"># 合并训练集和验证集
X_train = np.random.rand(100, 5)
X_val = np.random.rand(20, 5)
X_combined = np.concatenate(, axis=0)
</pre></div>
<p style="text-align:center"><img alt="" height="417" src="https://img.jbzj.com/file_images/article/202601/2026010609563335.jpg" width="1200" /></p>
<p class="maodian"><a name="_lab2_3_7"></a></p><h3>2. 图像分块处理</h3>
<div class="jb51code"><pre class="brush:py;"># 将大图像分割为8x8小块
image = np.random.rand(256, 256)
blocks = np.split(image, 32, axis=0)# 先垂直分割
blocks = # 再水平分割
image
blocks
</pre></div>
<p class="maodian"><a name="_lab2_3_8"></a></p><h3>3. 特征与标签分离</h3>
<div class="jb51code"><pre class="brush:py;">data = np.loadtxt("dataset.csv", delimiter=",")
X, y = np.hsplit(data, [-1])# 最后一列为标签
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>五、错误处理</h2>
<table><thead><tr><th>常见错误 </th><th>解决方法</th></tr></thead><tbody><tr><td>拼接维度不匹配</td><td>检查 <code>axis</code> 方向的数据形状一致性</td></tr><tr><td>分割数量无法整除</td><td>改用 <code>np.array_split</code></td></tr><tr><td>修改子数组影响原数据</td><td>使用 <code>.copy()</code> 创建独立副本</td></tr></tbody></table>
頁:
[1]