numpy 提供了多种方法用于数组拼接(concatenation)和分割(splitting),这些操作在数据预处理、特征工程和结果整合中至关重要。
一、数组拼接(concatenation)
1. 核心函数
| 函数 | 用途 | 适用场景 |
|---|---|---|
np.concatenate() | 沿指定轴拼接多个数组 | 通用拼接(需数组维度一致) |
np.vstack() | 垂直(按行)拼接 | 二维数组的行叠加 |
np.hstack() | 水平(按列)拼接 | 二维数组的列叠加 |
np.stack() | 沿新轴堆叠数组 | 增加新维度(如通道维度) |
2. 代码示例
np.concatenate
import numpy as np a = np.array([[1, 2], [3, 4]]) # shape (2,2) b = np.array([[5, 6]]) # shape (1,2) # 沿轴0(行方向)拼接 c = np.concatenate((a, b), axis=0) print(c) # 输出: # [[1 2] # [3 4] # [5 6]]
np.vstack和np.hstack
# 垂直拼接(等效于 concatenate(axis=0) v_combined = np.vstack([a, b]) # 结果同上 # 水平拼接(要求行数相同) d = np.array([[7], [8]]) # shape (2,1) h_combined = np.hstack([a, d]) print(h_combined) # 输出: # [[1 2 7] # [3 4 8]]
np.stack增加新维度
x = np.array([1, 2, 3]) y = np.array([4, 5, 6]) # 沿新轴0堆叠(创建三维数组) stacked = np.stack([x, y], axis=0) # shape (2,3) print(stacked) # 输出: # [[1 2 3] # [4 5 6]]
二、数组分割(splitting)
1. 核心函数
|函数 |用途 |适用场景|
|np.split() |沿指定轴均匀分割数组 |等分数组(需可整除)|
|np.vsplit() |垂直分割(按行) |二维数组的行分割|
|np.hsplit() |水平分割(按列) |二维数组的列分割|
|np.array_split() |支持不均匀分割 |处理无法整除的情况|
2. 代码示例
np.split均匀分割
arr = np.arange(9).reshape(3, 3) # [[0 1 2], [3 4 5], [6 7 8]] # 沿轴0分割为3个子数组(每行一个) sub_arrays = np.split(arr, 3, axis=0) # 结果: [array([[0,1,2]]), array([[3,4,5]]), array([[6,7,8]])]
np.array_split不均匀分割
# 将6个元素分割为4个子数组(允许不等分) arr = np.arange(6) # [0 1 2 3 4 5] subs = np.array_split(arr, 4) # 结果: [array([0,1]), array([2,3]), array([4]), array([5])] subs
np.hsplit按列分割
matrix = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) # 在第2列和第3列间分割 split_cols = np.hsplit(matrix, [2]) # 结果: # [array([[1, 2], [5, 6]]), # array([[3, 4], [7, 8]])] split_cols
三、内存与性能
1. 拼接后的数组为新对象
- 拼接操作始终生成新数组(原数据不受影响)
- 内存占用较高(需存储拼接后的完整数据)
2. 分割后的子数组为视图
- split() 返回的是原数组的视图(共享内存)
- 修改子数组会影响原数据
arr = np.arange(9).reshape(3, 3) sub_arrays = np.split(arr, 3, axis=0) sub_arrays[0][0,0] = 100 print(sub_arrays) # 输出: [array([[100, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])] print(arr[0, 0]) # 输出: 100 → 原数组被修改!
四、实用场景
1. 数据集合并
# 合并训练集和验证集 x_train = np.random.rand(100, 5) x_val = np.random.rand(20, 5) x_combined = np.concatenate([x_train, x_val], axis=0)

2. 图像分块处理
# 将大图像分割为8x8小块 image = np.random.rand(256, 256) blocks = np.split(image, 32, axis=0) # 先垂直分割 blocks = [np.split(block, 32, axis=1) for block in blocks] # 再水平分割 image blocks
3. 特征与标签分离
data = np.loadtxt("dataset.csv", delimiter=",")
x, y = np.hsplit(data, [-1]) # 最后一列为标签
五、错误处理
| 常见错误 | 解决方法 |
|---|---|
| 拼接维度不匹配 | 检查 axis 方向的数据形状一致性 |
| 分割数量无法整除 | 改用 np.array_split |
| 修改子数组影响原数据 | 使用 .copy() 创建独立副本 |
到此这篇关于numpy 数组拼接与分割的使用详解的文章就介绍到这了,更多相关numpy 数组拼接与分割内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论