NumPy数组形状深度解析:理解维度与创建多维数组

梦瑶小哥_7871

梦瑶小哥_7871

2025-11-21

924人浏览

原创

NumPy数组形状深度解析:理解维度与创建多维数组

本文深入探讨numpy数组的维度与形状,重点解析一维数组 `(n,)` 与二维数组 `(1, n)` 之间的关键区别,并通过代码示例演示如何基于输入结构准确创建不同维度的数组。同时,文章还将介绍两种实用的数组形状转换技巧,帮助读者更灵活地处理数据维度。

在NumPy中,数组的形状(shape)和维度(ndim)是理解其数据结构的核心概念。shape 属性返回一个元组,表示数组在每个维度上的大小,而 ndim 属性则表示数组的维度数量。正确理解这两个概念对于高效地进行数据处理和科学计算至关重要。

一维数组的创建与形状:(N,) 的含义

当我们使用一个扁平的Python列表创建NumPy数组时,NumPy会将其解释为一维数组。例如,np.array([7, 1]) 创建的数组,其 shape 为 (2,),表示它是一个包含两个元素的一维数组。这里的逗号表示这是一个包含一个元素的元组,即数组只有一个维度,其长度为2。

import numpy as np

# 创建一个一维数组
b_1d = np.array([7, 1], dtype=np.dtype(float))

print(f"数组 b_1d: {b_1d}")
print(f"b_1d 的形状 (shape): {b_1d.shape}") # 输出: (2,)
print(f"b_1d 的维度数量 (ndim): {b_1d.ndim}") # 输出: 1

从输出可以看出,b_1d 是一个真正的1D数组,其 ndim 为1。它不是一个一行两列的二维数组,而是一个简单的数据序列。

创建高维数组:嵌套列表的关键作用

要创建更高维度的NumPy数组,关键在于输入Python列表的嵌套层级。NumPy根据列表的嵌套深度来推断数组的维度。

创建二维数组:(1, N)

如果希望创建一个具有一行N列的二维数组,需要使用一个包含单个列表的嵌套列表。例如,np.array([[7, 1]]) 会被解释为一个二维数组。

# 创建一个二维数组(一行两列)
b_2d = np.array([[7, 1]], dtype=np.dtype(float))

print(f"数组 b_2d: {b_2d}")
print(f"b_2d 的形状 (shape): {b_2d.shape}") # 输出: (1, 2)
print(f"b_2d 的维度数量 (ndim): {b_2d.ndim}") # 输出: 2

这里,b_2d 的 shape 为 (1, 2),明确表示它是一个2D数组,包含1行和2列。

创建三维数组:(1, 1, N)

依此类推,要创建三维数组,需要更深层次的列表嵌套。

# 创建一个三维数组
b_3d = np.array([[[7, 1]]], dtype=np.dtype(float))

print(f"数组 b_3d: {b_3d}")
print(f"b_3d 的形状 (shape): {b_3d.shape}") # 输出: (1, 1, 2)
print(f"b_3d 的维度数量 (ndim): {b_3d.ndim}") # 输出: 3

灵活转换数组形状的技巧

在实际应用中,我们可能需要将已创建的数组从一个维度转换为另一个维度,例如将一维数组转换为二维数组。NumPy提供了多种灵活的方法来实现这一点。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

方法一:直接修改 shape 属性

可以直接修改数组的 shape 属性来改变其形状。需要注意的是,这种方法会原地修改数组,并且新形状的元素总数必须与原数组相同。

b_original = np.array([7, 1], dtype=np.dtype(float))
print(f"原始数组 b_original: {b_original}, 形状: {b_original.shape}")

# 将形状修改为 (1, 2)
b_original.shape = (1, 2)
print(f"修改形状后的 b_original: {b_original}, 形状: {b_original.shape}")
# 输出:
# 原始数组 b_original: [7. 1.], 形状: (2,)
# 修改形状后的 b_original: [[7. 1.]], 形状: (1, 2)

此方法简洁高效,但仅适用于元素总数不变的形状转换。

方法二:使用 None 或 np.newaxis 增加维度

通过在索引操作中使用 None 或 np.newaxis,可以在指定位置插入一个新的维度。这通常会返回一个数组的视图(view),而不是修改原数组。

b_array = np.array([7, 1], dtype=np.dtype(float))
print(f"原始数组 b_array: {b_array}, 形状: {b_array.shape}")

# 在第一个维度前添加一个新维度,使其成为行向量 (1, 2)
b_reshaped_none = b_array[None, :]
print(f"使用 [None, :] 转换后的 b_reshaped_none: {b_reshaped_none}, 形状: {b_reshaped_none.shape}")

# 或者使用 np.newaxis 达到同样效果
b_reshaped_newaxis = b_array[np.newaxis, :]
print(f"使用 [np.newaxis, :] 转换后的 b_reshaped_newaxis: {b_reshaped_newaxis}, 形状: {b_reshaped_newaxis.shape}")

# 如果想在最后一个维度后添加新维度,使其成为列向量 (2, 1)
b_reshaped_col = b_array[:, None]
print(f"使用 [:, None] 转换后的 b_reshaped_col (列向量): {b_reshaped_col}, 形状: {b_reshaped_col.shape}")
# 输出:
# 原始数组 b_array: [7. 1.], 形状: (2,)
# 使用 [None, :] 转换后的 b_reshaped_none: [[7. 1.]], 形状: (1, 2)
# 使用 [np.newaxis, :] 转换后的 b_reshaped_newaxis: [[7. 1.]], 形状: (1, 2)
# 使用 [:, None] 转换后的 b_reshaped_col (列向量): [[7.], [1.]], 形状: (2, 1)

这种方法非常灵活,可以精确控制新维度的插入位置,且通常不涉及数据复制,效率较高。

总结

深入理解NumPy如何根据输入列表的嵌套层级来推断数组维度至关重要。一个长度为 N 的一维数组其形状为 (N,),而一个具有一行 N 列的二维数组其形状为 (1, N)。这两者在概念和实际操作中有着本质的区别。

掌握直接修改 shape 属性和利用 None 或 np.newaxis 进行索引的技巧,能够帮助开发者在NumPy中灵活地控制数组的维度结构。这些技能在数据预处理、机器学习模型输入准备以及需要进行广播操作的场景中都非常有用,能够确保数据以正确的格式进行处理。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php中三维数组怎样求和
php中三维数组怎样求和

php中三维数组求和的方法:1、创建一个php示例文件;2、定义一个名为“$total”的变量,用于记录累加的结果。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2879

5

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.12.01

2721

7

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

2025.12.22

376

20

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

2026.01.06

417

22

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

2026.05.09

472

25

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

80

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

60

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

220

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

140

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习