NumPy-核心函数concatenate()深度解析

NumPy-核心函数concatenate深度解析

    • 一、concatenate()基础语法与核心参数
      • 函数签名与核心作用
      • 基础特性:形状匹配规则
    • 二、多维数组拼接实战示例
      • 1. 一维数组:最简单的序列拼接
      • 2. 二维数组:按行与按列拼接对比
        • 按行拼接(垂直方向,`axis=0`)
        • 按列拼接(水平方向,`axis=1`)
      • 3. 三维数组:沿深度轴拼接
      • 4. 灵活处理不同维度数组
    • 三、与其他拼接函数的对比分析
      • 1. vs vstack/hstack:便捷包装函数
      • 2. vs concatenate与stack:维度创建的区别
      • 3. 数据类型处理:自动转换与显式指定
    • 四、实战场景:concatenate的典型应用
      • 1. 数据集合并:批量处理多文件数据
      • 2. 图像数据增强:水平/垂直拼接
      • 3. 模型输入处理:特征与标签拼接
      • 4. 科学计算:矩阵分块重组
    • 五、注意事项与常见错误
      • 1. 形状不匹配错误
      • 2. 数据类型兼容性
      • 3. 内存效率:避免频繁拼接小数组

将多个数组按特定规则合并是数据处理的高频操作,NumPy提供的concatenate()函数作为数组拼接的核心工具,以其灵活性和高效性成为数据整合的关键桥梁。

一、concatenate()基础语法与核心参数

函数签名与核心作用

numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
  • 核心功能:沿指定轴连接一个或多个数组,生成新数组
  • 核心参数
    • (a1, a2, ...):必填,待连接的数组序列(需为相同数据类型或可自动转换)
    • axis:可选,指定连接轴(0为默认值,代表按垂直方向拼接)
    • dtype:可选,指定输出数组的数据类型(不指定时自动推断)

基础特性:形状匹配规则

连接轴(axis)上的数组形状必须一致,其他轴形状可不同。例如:

  • 一维数组连接:所有数组必须为一维(形状匹配无要求,直接按顺序拼接)
  • 二维数组按行拼接(axis=0):列数(shape[1])必须相同
  • 二维数组按列拼接(axis=1):行数(shape[0])必须相同

二、多维数组拼接实战示例

1. 一维数组:最简单的序列拼接

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.concatenate((a, b))
print(c)         # 输出:[1 2 3 4 5 6]
print(c.shape)   # 输出:(6,)

一维数组拼接时,axis参数可省略(默认axis=0),本质是将多个数组的元素按顺序合并为一个长数组。

2. 二维数组:按行与按列拼接对比

按行拼接(垂直方向,axis=0

需保证列数(第二维)相同:

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
row_concat = np.concatenate((arr1, arr2), axis=0)
print(row_concat)
# 输出:
# [[1 2]
#  [3 4]
#  [5 6]
#  [7 8]]
# 形状:(4, 2)(行数增加,列数不变)
按列拼接(水平方向,axis=1

需保证行数(第一维)相同:

arr3 = np.array([[1, 3], [5, 7]])
col_concat = np.concatenate((arr1, arr3), axis=1)
print(col_concat)
# 输出:
# [[1 2 1 3]
#  [3 4 5 7]]
# 形状:(2, 4)(列数增加,行数不变)

3. 三维数组:沿深度轴拼接

假设处理视频数据(形状为(帧数, 高度, 宽度)),需按帧数合并:

video1 = np.random.rand(2, 100, 100)   # 2帧100x100图像
video2 = np.random.rand(3, 100, 100)   # 3帧同尺寸图像
merged_video = np.concatenate((video1, video2), axis=0)
print(merged_video.shape)  # 输出:(5, 100, 100)(帧数合并,高度宽度不变)

4. 灵活处理不同维度数组

通过axis参数,可将低维数组与高维数组拼接(自动广播维度):

arr_2d = np.array([[1, 2], [3, 4]])
arr_1d = np.array([5, 6])
# 按行拼接:将1D数组视为2D数组(shape=(1,2))
row_concat = np.concatenate((arr_2d, [arr_1d]), axis=0)
print(row_concat)
# 输出:
# [[1 2]
#  [3 4]
#  [5 6]]

三、与其他拼接函数的对比分析

1. vs vstack/hstack:便捷包装函数

  • vstack((a1, a2)):等价于concatenate((a1, a2), axis=0),专用于垂直拼接(按行)
  • hstack((a1, a2)):等价于concatenate((a1, a2), axis=1),专用于水平拼接(按列)
  • 适用场景:当明确需要行/列拼接时,使用vstack/hstack更易读;需处理任意轴时用concatenate

2. vs concatenate与stack:维度创建的区别

  • concatenate:沿已有轴合并,不增加新维度
  • stack((a1, a2), axis=2):在新轴上创建堆叠,会增加维度(例如将两个2D数组堆叠为3D数组)

示例对比

a = np.array([1, 2]); b = np.array([3, 4])
concat_result = np.concatenate((a, b), axis=0)   # shape=(4,)
stack_result = np.stack((a, b), axis=0)           # shape=(2, 2)

3. 数据类型处理:自动转换与显式指定

当输入数组数据类型不同时,concatenate会按安全规则升级类型:

int_arr = np.array([1, 2], dtype=np.int32)
float_arr = np.array([3.0, 4.0], dtype=np.float64)
result = np.concatenate((int_arr, float_arr))
print(result.dtype)  # 输出:float64(int32升级为float64)# 显式指定类型:
result = np.concatenate((int_arr, float_arr), dtype=np.int32)  # 警告:可能丢失精度

四、实战场景:concatenate的典型应用

1. 数据集合并:批量处理多文件数据

在数据分析中,常需合并多个CSV文件读取的数组:

# 假设data1.shape=(100, 5), data2.shape=(200, 5)(同列数)
merged_data = np.concatenate((data1, data2), axis=0)  # 按行合并,总样本300

2. 图像数据增强:水平/垂直拼接

在计算机视觉中,可通过拼接生成新训练样本:

image1 = cv2.imread("image1.jpg")  # shape=(H, W, C)
image2 = cv2.imread("image2.jpg")  # 同尺寸图像
# 水平拼接(左右并列)
hori_concat = np.concatenate((image1, image2), axis=1)  # shape=(H, 2W, C)
# 垂直拼接(上下堆叠)
vert_concat = np.concatenate((image1, image2), axis=0)  # shape=(2H, W, C)

3. 模型输入处理:特征与标签拼接

在机器学习中,常需将特征矩阵与标签向量合并为完整数据集:

features = np.random.rand(100, 10)   # 100样本,10特征
labels = np.random.randint(0, 2, size=(100, 1))  # 100标签(列向量)
dataset = np.concatenate((features, labels), axis=1)  # 按列合并,shape=(100, 11)

4. 科学计算:矩阵分块重组

在数值计算中,可将大矩阵拆分为子矩阵处理后再合并:

# 拆分矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 重组为分块矩阵
block_matrix = np.concatenate((np.concatenate((A, np.zeros_like(A)), axis=1),np.concatenate((np.zeros_like(A), B), axis=1)),axis=0
)
# 输出:
# [[1. 2. 0. 0.]
#  [3. 4. 0. 0.]
#  [0. 0. 5. 6.]
#  [0. 0. 7. 8.]]

五、注意事项与常见错误

1. 形状不匹配错误

当连接轴上的维度不一致时,会抛出ValueError

arr1 = np.array([[1, 2], [3, 4]])  # shape=(2,2)
arr2 = np.array([[5, 6, 7]])       # shape=(1,3)
try:np.concatenate((arr1, arr2), axis=0)  # 错误:列数不匹配(2 vs 3)
except ValueError as e:print(e)  # 输出:all the input array dimensions except for the concatenation axis must match exactly

2. 数据类型兼容性

虽然concatenate支持类型自动转换,但需注意精度丢失风险:

# 危险操作:将float数组转为int可能丢失小数部分
float_arr = np.array([1.5, 2.5])
int_arr = np.concatenate((float_arr,), dtype=np.int32)
print(int_arr)  # 输出:[1 2](直接截断而非四舍五入)

3. 内存效率:避免频繁拼接小数组

多次拼接小数组会导致多次内存复制,建议预先计算总长度并初始化空数组:

# 低效做法(每次拼接生成新数组)
result = np.array([])
for i in range(1000):result = np.concatenate((result, np.array([i])))# 高效做法(预分配内存)
result = np.empty(1000, dtype=int)
for i in range(1000):result[i] = i

总结
concatenate()是NumPy数组拼接的核心工具:

  1. 灵活性:通过axis参数支持任意维度的数组连接,覆盖从一维到N维的所有场景
  2. 高效性:底层基于C实现,避免Python循环的性能损耗,适合大规模数据处理
  3. 兼容性:支持不同数据类型的自动转换,无缝衔接各类输入数据

That’s all, thanks for reading!
觉得有用就点个赞、收进收藏夹吧!关注我,获取更多干货~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912943.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aws(学习笔记第四十八课) appsync-graphql-dynamodb

aws(学习笔记第四十八课) appsync-graphql-dynamodb 使用graphql来方便操作dynamodb 理解graphql中的graphql api,schema,resolver 学习内容: graphqlgraphql apischemaresolver 1. 代码连接和修改 1.1 代码链接 代码链接(app…

关于微前端框架micro,子应用设置--el-primary-color失效的问题

设置了manualChunks导致失效,去掉即可,比较小众的问题 下面是deepseek的分析 关于 manualChunks 导致 Element Plus 主题变量失效的问题 你找到的确实是问题的关键所在。这个 manualChunks 配置影响了 Element Plus 样式和变量的加载顺序,从而导致主题变量失效。…

MySQL 学习 之 你还在用 TIMESTAMP 吗?

目录 1. 弊端1.1. 取值范围1.2. 时区依赖1.3. 隐式转换 2. 区别3. 解决 1. 弊端 1.1. 取值范围 TIMESTAMP 的取值范围为 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC,超出范围的数据会被强制归零或触发异常‌。 具体表现为在基金债券等业务中&#xff0…

java中字节和字符有何区别,为什么有字节流和字符流?

在Java中,字节(byte)和字符(char)是两种不同的数据类型,它们的主要区别在于所表示的数据单位、用途以及编码方式,字节流和字符流的区分就是为了解决编码问题。 字节(byte)&#xff…

伴随矩阵 线性代数

伴随矩阵的定义 伴随矩阵的作用是什么?我们可以看到其伴随矩阵乘上自己等于一个数(自身的行列式)乘以E,所以对于一个方阵来说,其逆矩阵就是自己的伴随矩阵的倍数。 所以说伴随矩阵的作用就是用来更好的求解逆矩阵的。…

百胜软件获邀走进华为,AI实践经验分享精彩绽放

在数字化浪潮席卷全球的当下,零售行业正经历着深刻变革,人工智能技术成为重塑行业格局的关键力量。6月26日,“走进华为——智领零售,AI赋能新未来”活动在华为练秋湖研发中心成功举办。百胜软件作为数字零售深耕者,携“…

六种扎根理论的编码方法

一、实境编码 1.概念:实境编码是一种基于参与者原生语言的质性编码方法,其核心在于直接采用研究对象在访谈、观察或文本中使用的原始词汇、短语或独特表达作为分析代码。该方法通过保留数据的"原生态"语言形式(如方言、隐喻、习惯用…

【Spring篇09】:制作自己的spring-boot-starter依赖1

文章目录 1. Spring Boot Starter 的本质2. Starter 的模块结构(推荐)3. 制作 xxx-spring-boot-autoconfigure 模块3.1 添加必要的依赖3.2 编写具体功能的配置类3.3 编写自动化配置类 (AutoConfiguration)3.4 注册自动化配置类 (.imports 或 spring.fact…

Qt6之qml自定义控件开发流程指南

Qt6之qml自定义控件开发流程指南 🛠️ 一、基础控件创建 定义 QML 文件 在工程中新建 QML 文件(如 CustomButton.qml),文件名首字母大写。 使用基础组件(如 Rectangle、Text)构建控件逻辑,通过…

Vue简介,什么是Vue(Vue3)?

什么是Vue? Vue是一款用于构建用户界面的JavaScript框架。 它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单的还是复杂地界面,Vue都可以胜任。 声明式渲染…

从零开始构建Airbyte数据管道:PostgreSQL到BigQuery实战指南

作为数据工程师,ETL(Extract, Transform, Load)流程是日常工作的核心。然而,构建和维护数据管道往往耗时且复杂。幸运的是,开源工具Airbyte提供了一种更便捷的解决方案——它支持350预构建连接器,允许通过无…

JavaScript的初步学习

目录 JavaScript简介 主要特点 主要用途 JavaScript的基本特性 JavaScript的引入方式 1. 内联方式 (Inline JavaScript) 2. 内部方式 (Internal JavaScript / Embedded JavaScript) 3. 外部方式 (External JavaScript) JavaScript的语法介绍 1.书写语法 2.输出语句 3.…

洛谷P1379 八数码难题【A-star】

P1379 八数码难题 八数码难题首先要进行有解性判定,避免无解情况下盲目搜索浪费时间。 有解性判定 P10454 奇数码问题 题意简述 在一个 n n n \times n nn 的网格中进行,其中 n n n 为奇数, 1 1 1 个空格和 [ 1 , n 2 − 1 ] [1,n^2…

MySQL Buffer Pool 深度解析:从架构设计到性能优化(附详细结构图解)

在 MySQL 数据库的世界里,有一个决定性能上限的"神秘仓库"——Buffer Pool。它就像超市的货架,把最常用的商品(数据)放在最方便拿取的地方,避免每次都要去仓库(磁盘)取货。今天我们就…

使用numpy的快速傅里叶变换的一些问题

离散傅里叶变换(DFT)的频率(或波数)确实主要由采样点数和物理步长决定。 最高波数和最小波长的乘积是1。单位长度内波的周期数。 (注意角波数是 k 2 π λ k \frac{2 \pi}{\lambda} kλ2π​) 使用numpy…

DVWA靶场通关笔记-CSRF(High级别)

目录 一、CSRF Token 二、代码审计(High级别) 1、渗透准备 2、源码分析 三、渗透实战 1、渗透准备 2、修改URL重放失败 3、burpsuite尝试重放失败 4、安装CSRF Token Tracker 5、安装logger插件 6、配置CSRF Token Tracker 7、bp再次重放报文…

Redis实战:数据安全与性能保障

数据安全 持久化策略 RDB持久化:通过创建快照将内存中的数据写入到磁盘上的RDB文件中。可以在配置文件中设置save参数来指定在多少秒内有多少次写操作时触发快照保存。例如,save 900 1表示900秒内至少有1次写操作时保存快照。 AOF持久化:将每…

人脸活体识别3:C/C++实现实时眨眼、张嘴、点头、摇头检测

> 当AI能识破照片与真人的区别,我们才真正跨入生物识别安全时代 --- ### 一、活体检测:数字世界的守门人 **传统人脸识别的致命缺陷**: - 高清照片欺骗成功率 > 85% - 视频回放攻击成本 < $50 - 3D面具破解率高达72% **我们的解决方案**: ```mermaid graph …

【Linux】AlmaLinux 无法使用root用户登录cockpit控制台问题解决

在虚拟机安装AlmaLinux 9.6&#xff0c;安装过程中需要允许使用root用户和SSH协议登录服务器。但是&#xff0c;在使用root用户登录cockpit管理后台时&#xff0c;系统提示“权限被拒绝”。 经过查询资料&#xff0c;可以通过下面的方法来解决此问题。 编辑 /etc/cockpit/disa…

【Java面试】讲讲HashMap的常用方法,以及底层实现?

1. 底层数据结构 数组链表红黑树&#xff08;JDK 1.8&#xff09;&#xff1a; 数组&#xff08;Node[] table&#xff09;存储桶&#xff08;bucket&#xff09;&#xff0c;每个桶是链表或红黑树的头节点。链表解决哈希冲突&#xff0c;当链表长度 ≥ 8 且数组容量 ≥ 64 时…