NumPy 中文教程

第一部分:基础认知与环境准备
第 1 章 全面认识 NumPy
第 2 章 开发环境搭建与验证
第二部分:核心对象 ——ndarray 数组
第 3 章 ndarray 数组基础
第 4 章 数组的形状与维度操作
第四部分:高级应用与数据处理
第 8 章 数组的排序、查找与去重
第 9 章 缺失值与异常值处理
第 10 章 随机数生成与抽样
第 11 章 文件读写与数据交互
第五部分:实战场景与落地应用
第 12 章 数值计算实战
第 13 章 数据分析实战
第六部分:优化进阶与问题解决
第 14 章 NumPy 性能优化
第 15 章 NumPy 进阶扩展
第 16 章 常见问题与解决方案

4.1 数组重塑与展平

NumPy数组重塑与展平完全指南:重塑、展平、调整维度详解

NumPy 中文教程

本教程详细讲解NumPy中数组重塑与展平的核心方法,包括reshape()、flatten()、ravel()、np.expand_dims()和np.squeeze(),配有简单易懂的示例,帮助初学者轻松掌握NumPy数组操作技巧。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

NumPy数组重塑与展平完全指南

引言

NumPy(Numerical Python)是Python中用于科学计算的核心库,广泛用于数据分析、机器学习和深度学习。数组是NumPy的核心数据结构,操作数组形状是常见的任务之一。本教程将深入探讨数组重塑与展平,涵盖reshape()、flatten()、ravel()、np.expand_dims()和np.squeeze()等方法,适合新手学习。

1. 重塑(reshape())与维度调整

什么是重塑?

重塑是指改变数组的形状,而不改变数据本身。例如,将一个一维数组重塑为二维矩阵。

使用reshape()方法

reshape()函数返回一个新数组,原始数组不变。它接受一个元组作为参数,指定新形状。

语法

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
reshaped_arr = arr.reshape((2, 3))  # 重塑为2行3列的数组
print(reshaped_arr)

输出:

[[1 2 3]
 [4 5 6]]

重塑规则

  • 新形状的元素数必须与原始数组相同(例如,6个元素可以重塑为(2,3)或(3,2))。
  • 如果使用-1作为维度,NumPy会自动计算该维度的大小(例如,arr.reshape(-1, 2)会将数组重塑为列数为2的数组)。

维度调整示例

# 一维到多维
arr = np.arange(12)  # [0, 1, 2, ..., 11]
arr2d = arr.reshape(3, 4)  # 3行4列
print(arr2d)

# 多维重塑
arr = np.array([[1, 2], [3, 4], [5, 6]])
arr_reshaped = arr.reshape(2, 3)  # 重塑为2行3列
print(arr_reshaped)

2. 展平(flatten()与ravel())的区别

展平是将多维数组转换为一维数组的过程。NumPy提供了flatten()和ravel()两种方法。

flatten()方法

  • 返回一个新数组的副本,对原始数组没有影响。
  • 语法:arr.flatten()
arr = np.array([[1, 2, 3], [4, 5, 6]])
flattened = arr.flatten()
print(flattened)  # 输出:[1 2 3 4 5 6]

ravel()方法

  • 返回一个视图(view)或引用原始数组,可能修改原始数组(如果是视图且可写)。
  • 语法:arr.ravel()
arr = np.array([[1, 2, 3], [4, 5, 6]])
raveled = arr.ravel()
print(raveled)  # 输出:[1 2 3 4 5 6]

关键区别

特性 flatten() ravel()
内存 创建副本,内存占用高 创建视图,内存效率高
性能 较慢 较快
修改影响 不影响原始数组 可能影响原始数组(如果视图可写)

示例对比

arr = np.array([[1, 2], [3, 4]])
flattened = arr.flatten()
raveled = arr.ravel()
flattened[0] = 10  # 不影响arr
raveled[0] = 10   # 可能修改arr,如果arr是C风格数组
print(arr)  # 输出可能变化

3. 维度增加与删除(np.expand_dims()与np.squeeze())

有时需要增加或删除数组的维度,例如在机器学习中调整数据形状。

np.expand_dims():增加维度

  • 在指定轴增加一个新维度,通常用于将一维数组变为二维。
  • 语法:np.expand_dims(arr, axis)
arr = np.array([1, 2, 3])
expanded = np.expand_dims(arr, axis=0)  # 在轴0增加维度,变为(1, 3)
print(expanded.shape)  # 输出:(1, 3)
print(expanded)

输出:

[[1 2 3]]

np.squeeze():删除维度

  • 删除数组中所有单维度(size为1的维度)。
  • 语法:np.squeeze(arr)arr.squeeze()
arr = np.array([[[1, 2, 3]]])  # 形状:(1, 1, 3)
squeezed = np.squeeze(arr)  # 删除所有单维度
print(squeezed.shape)  # 输出:(3,)
print(squeezed)  # 输出:[1 2 3]

应用场景

  • expand_dims:在神经网络中,为批量处理添加批次维度。
  • squeeze:在数据处理中去除不必要的维度。

4. 总结与最佳实践

  • 使用reshape()改变数组形状,确保元素数一致。
  • 选择flatten()ravel()时,考虑内存和性能需求:如果需要安全副本,用flatten();如果需要高效视图,用ravel()
  • np.expand_dims()np.squeeze()适用于维度微调,避免手动重塑。

常见错误

  • 重塑时元素数不匹配会导致错误。
  • 混淆flatten()ravel()可能导致意外数据修改。

通过本教程,您应该能掌握NumPy数组重塑与展平的核心方法。继续实践,以加深理解!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包