当前位置: 首页 > news >正文

numpy的操作

numpy的array合并

合并 NumPy 数组的方法

NumPy 提供了多种合并数组的方式,主要包括np.concatenatenp.vstacknp.hstacknp.stack等函数。以下是具体的使用方法和示例。

使用np.concatenate合并数组

np.concatenate是通用的合并函数,可以沿指定轴合并多个数组。默认沿第一个轴(axis=0)合并。

import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 沿 axis=0 合并(默认) result = np.concatenate((a, b)) print(result) # 输出: [1 2 3 4 5 6] # 沿 axis=1 合并(需要数组是二维的) a_2d = np.array([[1, 2], [3, 4]]) b_2d = np.array([[5, 6], [7, 8]]) result = np.concatenate((a_2d, b_2d), axis=1) print(result) # 输出: # [[1 2 5 6] # [3 4 7 8]]
使用np.vstack垂直合并数组

np.vstack用于垂直合并数组(沿 axis=0),相当于np.concatenate(..., axis=0)的简化版。

a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) result = np.vstack((a, b)) print(result) # 输出: # [[1 2 3] # [4 5 6]]
使用np.hstack水平合并数组

np.hstack用于水平合并数组(沿 axis=1),相当于np.concatenate(..., axis=1)的简化版。

a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) result = np.hstack((a, b)) print(result) # 输出: [1 2 3 4 5 6]
使用np.stack堆叠数组

np.stack会创建一个新的轴来堆叠数组,适用于需要增加维度的场景。

a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 沿新轴堆叠(默认 axis=0) result = np.stack((a, b)) print(result) # 输出: # [[1 2 3] # [4 5 6]] # 沿 axis=1 堆叠 result = np.stack((a, b), axis=1) print(result) # 输出: # [[1 4] # [2 5] # [3 6]]
使用np.column_stacknp.row_stack

np.column_stack将一维数组作为列堆叠成二维数组,np.row_stack将一维数组作为行堆叠。

a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 列堆叠 result = np.column_stack((a, b)) print(result) # 输出: # [[1 4] # [2 5] # [3 6]] # 行堆叠(等同于 vstack) result = np.row_stack((a, b)) print(result) # 输出: # [[1 2 3] # [4 5 6]]

注意事项

  • 合并数组时需确保维度匹配。例如,np.concatenate要求除合并轴外其他维度相同。
  • np.stack会引入新轴,而其他函数通常不会。
  • 对于高维数组,可以指定axis参数控制合并方向。

np.newaxis的作用

np.newaxis是 NumPy 中用于扩展数组维度的工具,本质是None的别名。它的作用是在指定位置插入一个长度为 1 的新轴,从而改变数组的形状。

[:, np.newaxis]的用法

  • 功能:在列方向(第二维度)插入新轴,将一维数组转换为二维的列向量。
  • 示例
    import numpy as np arr = np.array([1, 2, 3]) col_vector = arr[:, np.newaxis] print(col_vector.shape) # 输出 (3, 1) print(col_vector)
    输出结果:
    [[1] [2] [3]]

[np.newaxis, :]的用法

  • 功能:在行方向(第一维度)插入新轴,将一维数组转换为二维的行向量。
  • 示例
    row_vector = arr[np.newaxis, :] print(row_vector.shape) # 输出 (1, 3) print(row_vector)
    输出结果:
    [[1 2 3]]

应用场景

  • 广播机制:调整数组形状以满足广播规则,例如计算矩阵与向量的加法。
  • 维度对齐:在神经网络中输入数据时,常需将一维数据扩展为二维(如(n,)(n, 1))。

注意事项

  • 操作后生成的是视图(view),而非副本,修改新数组会影响原数组。
  • 高维数组也可用np.newaxis,如arr[np.newaxis, :, np.newaxis]会插入两个新轴。

numpy 数组分割方法

NumPy 提供了多种数组分割函数,用于将数组拆分为多个子数组。以下是常用的分割方法:

np.split

将数组沿指定轴分割为多个子数组。可以指定分割点或均匀分割。

import numpy as np arr = np.arange(9) # 在索引3和5处分割 result = np.split(arr, [3, 5])

np.array_split

与split类似,但允许不均匀分割。当无法均分时,不会报错。

arr = np.arange(7) # 分成3个数组 result = np.array_split(arr, 3)

np.hsplit

水平分割数组,相当于沿列分割(axis=1)。

arr = np.arange(16).reshape(4,4) # 分成2个数组 result = np.hsplit(arr, 2)

np.vsplit

垂直分割数组,相当于沿行分割(axis=0)。

arr = np.arange(16).reshape(4,4) # 分成2个数组 result = np.vsplit(arr, 2)

np.dsplit

深度分割数组,沿第三个维度分割(axis=2),适用于3D数组。

arr = np.arange(24).reshape(2,4,3) # 分成3个数组 result = np.dsplit(arr, 3)

分割参数说明

  • 整数参数:表示均匀分割的数量
  • 列表参数:表示分割点的索引位置
  • axis参数:指定分割的轴向(默认0)

应用场景

  • 数据预处理时将数据集分割为训练集和测试集
  • 图像处理时分割通道
  • 并行计算时分配数据块

注意:所有分割函数返回的都是原数组的视图,修改子数组会影响原数组。如果需要独立副本,应显式调用copy()方法。

numpy的copy与deep copy

在NumPy中,copydeep copy(深度拷贝)是两种不同的数组复制方式,主要区别在于内存管理和对嵌套对象的处理。

浅拷贝(view)与深拷贝(copy)

  • 浅拷贝(如切片操作)仅创建新数组对象,但共享原始数组的数据缓冲区。修改浅拷贝会影响原始数组。
  • 深拷贝(np.copy()arr.copy())完全复制数组及其数据,新旧数组独立。

关键差异

  1. 内存独立性

    • copy生成的新数组拥有独立的内存空间,修改不会影响原数组。
    • 直接赋值或视图(view)共享内存,修改会同步反映到原数组。
  2. 嵌套对象处理

    • NumPy的copy默认是浅拷贝,对于数组内的Python对象(如列表),仍会共享引用。
    • 标准库copy.deepcopy()会递归复制所有嵌套对象,确保完全独立。

使用方法示例

基本拷贝操作

import numpy as np arr = np.array([1, 2, 3]) arr_copy = arr.copy() # 深拷贝 arr_view = arr[:] # 浅拷贝 arr_copy[0] = 99 # 不影响原数组 arr_view[1] = 88 # 原数组被修改

嵌套对象场景

import copy nested_arr = np.array([1, [2, 3], 4]) shallow_copy = nested_arr.copy() # 内嵌列表仍共享引用 deep_copy = copy.deepcopy(nested_arr) # 完全独立复制 shallow_copy[1][0] = 99 # 会影响原数组的嵌套列表 deep_copy[1][0] = 88 # 完全不影响原数组

性能考量

  • 深拷贝需要分配新内存并复制所有数据,对于大型数组会有性能开销。
  • 浅拷贝更高效,但需注意副作用。在不需要独立数据时,优先使用视图(view)操作。

http://www.jsqmd.com/news/582356/

相关文章:

  • 从3大维度掌握zotero-format-metadata:解决文献格式混乱的实战指南
  • C++权限对继承的影响
  • UE5-MCP架构深度解析:AI驱动的游戏开发自动化引擎
  • C++27执行策略迁移 checklist:从C++20升级必做的7项静态断言校验、3类编译器诊断开关启用及GCC 14.3/Clang 18.1/MSVC 19.42兼容性矩阵
  • 太阳能水位监测站
  • GOOSE-LightGBM自动化参数寻优的多变量分类预测Matlab程序
  • 如何通过CyberpunkSaveEditor实现赛博朋克2077存档编辑与自定义体验?
  • 保研人:值得推荐的保研机构,源于权威背景与海量成功案例 - 博客湾
  • ObsPy实战入门:从时间序列数据处理到地震事件可视化的5个核心技巧
  • Z-Image-Turbo_Sugar脸部Lora效果展示:长时间生成任务稳定性与显存泄漏测试
  • 猫抓扩展深度诊断指南:从症状到解决方案的系统分析
  • C语言条件运算符详解:用法、求值规则及需注意的要点
  • 多功能自动气象站
  • 火焰烟雾识别工程化落地:方案选型到边缘部署
  • 2026台车式退火炉选型对比:国际品牌VS洛阳科热,谁更值得买? - 品牌推荐大师
  • Ant Design Ellipsis 中的判断逻辑 isEleEllipsis 方法非常消耗性能
  • JetBrains Runtime实战指南:5个关键步骤解决90%配置难题
  • 毫秒级响应:MHY_Scanner重构游戏直播扫码体验的技术突破与行业价值
  • C语言怎么学?系统学习路线图分享
  • OpenClaw(小龙虾)Win 11 一键部署教程|490+大模型全覆盖
  • Sif关键词和卖家精灵哪个好(附Sif/卖家精灵折扣码) - 麦麦唛
  • 超低功耗血压和心率监护仪参考设计
  • Python 3.15 新突破:frozendict 带来字典应用新可能
  • 终极指南:如何用QMCDecode快速解密QQ音乐加密格式
  • 边缘计算对工控机的性能要求有多高?
  • AI报告编审解决方案引领生产报告3.0:IA-Lab AI检测报告生成助手协同IACheck,重塑检测行业效率与质量标准
  • 2026 国产 DFM 软件推荐:如何实现 Mentor Valor NPI 的平替 - 品牌2026
  • AI赋能SEO的新纪元:关键词优化策略的最新实践与探索
  • 颈椎疼别硬扛!不是所有按摩都管用,科学治疗才能摆脱困扰
  • 基于深度学习的香蕉成熟度检测系统(YOLO12/11/v8/v5模型+django)(源码+lw+部署文档+讲解等)