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

Numpy 之 reshape 教程

Numpy reshape 教程

1. 基本介绍

reshape 是 Numpy 数组对象(ndarray)的一个方法,用于改变数组的形状(维度),但不改变其数据内容。常用于数据预处理、矩阵运算等场景。

语法:

ndarray.reshape(newshape, order='C')
  • newshape:新形状,可以是整数或元组(如 (2, 3))。
  • order:可选,'C' 表示按行优先(默认),'F' 表示按列优先。

2. 参数详解

  • -1:自动推断该维度的大小,Numpy 会根据数组总元素个数自动计算。
  • 正整数:指定该维度的大小。

注意:
新形状的元素总数必须与原数组一致,否则会报错。


3. 常见用法举例

3.1 一维转二维

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

3.2 使用 -1 自动推断

a = np.array([1, 2, 3, 4, 5, 6])
b = a.reshape(-1, 2)  # 自动计算行数
print(b)
# 输出:
# [[1 2]
#  [3 4]
#  [5 6]]

3.3 转为列向量/行向量

a = np.array([1, 2, 3, 4])
col_vec = a.reshape(-1, 1)  # 4行1列,列向量
row_vec = a.reshape(1, -1)  # 1行4列,行向量
print(col_vec)
# [[1]
#  [2]
#  [3]
#  [4]]
print(row_vec)
# [[1 2 3 4]]

3.4 高维数组变形

# 创建一个包含0-23的一维数组
a = np.arange(24)  # [0, 1, 2, ..., 23]# 将一维数组重塑为三维数组
# 参数(2, 3, 4)的含义:
# - 2: 第一维,表示有2个矩阵
# - 3: 第二维,每个矩阵有3行
# - 4: 第三维,每个矩阵有4列
# 最终得到2个3×4的矩阵,总共24个元素
b = a.reshape(2, 3, 4)  # 打印数组形状,验证维度
print("数组形状:", b.shape)  # 输出: (2, 3, 4)# 打印数组内容,便于理解
print("数组内容:")
print(b)
# 输出类似:
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

4. 常见错误与注意事项

  • 元素总数不一致会报错:
    a = np.array([1, 2, 3, 4])
    # a.reshape(3, 2)  # 报错:不能reshape为6个元素
    
  • reshape 返回新数组,原数组不变(除非用 a.shape = ...
  • 可以链式调用:
    a = np.arange(12)
    b = a.reshape(3, 4).T  # 先变3x4,再转置
    

5. 实战场景

  • 批量数据处理:如将一维数据转为二维特征矩阵
  • 图像处理:如将一维像素流reshape为二维图片
  • 深度学习:如批量输入(batch)reshape为 (batch_size, features)

6. 进阶技巧

  • 恢复原形状:可以用 reshape(-1) 或 flatten() 将多维数组拉平成一维
  • order 参数order='F' 按列优先(Fortran风格),如在某些科学计算场景下使用

7. 总结

  • reshape 是数据预处理和矩阵运算中非常常用的工具
  • 合理使用 -1 可以大大简化代码
  • 注意元素总数必须一致

如需更多实际案例或有特定场景需求,欢迎继续提问!

http://www.xdnf.cn/news/904807.html

相关文章:

  • 【OpenGL学习】(五)自定义着色器类
  • Redis知识
  • 强化学习基础概念图文版笔记
  • 【QT常用技术讲解】多线程执行后台命令行的两种方式(后台运行和返回打印信息)
  • 【Linux】grep 命令详解及使用示例:搜索匹配指定模式的文本行
  • 【JJ斗地主-注册安全分析报告】
  • 20250606-C#知识:匿名函数、Lambda表达式与闭包
  • 动态IP与静态IP:数字世界的“变脸术”与“身份证”
  • CSS 轮廓(Outline)与边框(Border)的深度解析
  • 【Zephyr 系列 12】BLE + NVS + 低功耗融合实战:打造可配置蓝牙信标系统
  • Codeforces EDU Round 179 A~D
  • 【自动驾驶避障开发】如何让障碍物在 RViz 中‘显形’?呈现感知数据转 Polygon 全流程
  • AlphaDrive:通过强化学习和推理释放自动驾驶中 VLM 的力量
  • C# 日志管理功能代码
  • Electron Fiddle使用笔记
  • ComfyUI 中如何使用 Depth ControlNet SD1.5
  • 嵌入式学习笔记-freeRTOS taskENTER_CRITICAL(_FROM_ISR)跟taskEXIT_CRITICAL(_FROM_ISR)函数解析
  • 金蝶云星空·旗舰版与吉客云:赋能电商企业业财一体化
  • 软件功能模块归属论证方法
  • Python训练营打卡 Day46
  • 气体绝缘开关设备局部放电监测中PRPD和PRPS图谱的深度分析
  • 影楼精修-AI衣服祛褶皱算法解析
  • 【动手学深度学习】3.1. 线性回归
  • 集成电路设计:从概念到实现的完整解析优雅草卓伊凡
  • 【配置 YOLOX 用于按目录分类的图片数据集】
  • coze智能体后端接入问题:
  • 视觉分析在人员行为属性检测中的应用
  • 未来十年 Python 学习路线全解析
  • 为什么说数列是特殊的函数
  • NLP学习路线图(二十九):BERT及其变体