0

0

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

心靈之曲

心靈之曲

发布时间:2025-11-10 13:00:04

|

999人浏览过

|

来源于php中文网

原创

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

本教程深入解析NumPy数组的维度与形状。我们将澄清为何np.array([7, 1])生成形状为(2,)的一维数组,而非预期的(1, 2)。文章将详细解释如何通过嵌套列表创建多维数组,并提供多种将一维数组转换为指定二维形状的实用技巧,助您精准控制NumPy数据结构。

在NumPy中,理解数组的形状(shape)和维度(ndim)是高效数据处理的基础。这两个属性决定了数组的结构,对于数据的存储、操作和计算至关重要。初学者常会混淆一维数组与具有单行或单列的二维数组的表示方式。本文将通过具体示例,详细阐述NumPy数组的维度判断规则,并提供灵活的形状转换方法。

1. NumPy数组的维度与形状基础

NumPy数组的shape属性返回一个元组,表示数组在每个维度上的大小。ndim属性则返回数组的维度数量。例如,一个形状为(m, n)的数组是二维的,表示它有m行和n列。

考虑以下代码示例:

import numpy as np

A = np.array([
        [-1, 3],
        [3, 2]
    ], dtype=np.dtype(float))

b = np.array([7, 1], dtype=np.dtype(float))

print(f"Shape of A: {A.shape}")
print(f"Shape of b: {b.shape}")
print(f"Dimensions of A: {A.ndim}")
print(f"Dimensions of b: {b.ndim}")

输出结果如下:

Shape of A: (2, 2)
Shape of b: (2,)
Dimensions of A: 2
Dimensions of b: 1

从输出可以看出,A是一个形状为(2, 2)的二维数组,这符合我们的直观理解。然而,b的形状是(2,),维度是1。这表明b是一个一维数组,包含两个元素。许多用户可能会预期b的形状是(1, 2),即一个包含一行两列的二维数组。这种差异是理解NumPy数组维度的关键。

2. 理解一维与多维数组的创建

NumPy数组的维度主要由其初始化时嵌套列表的层数决定。

2.1 一维数组

当使用单个方括号列表初始化数组时,NumPy会创建一个一维数组。例如,np.array([7, 1])表示一个包含两个元素的序列,它没有“行”或“列”的概念,只有一个维度。

b_1d = np.array([7, 1], dtype=np.dtype(float))
print(f"Array: {b_1d}")
print(f"Shape: {b_1d.shape}") # Output: (2,)
print(f"Dimensions: {b_1d.ndim}") # Output: 1

2.2 二维数组

要创建具有一行两列的二维数组,需要使用两层嵌套的方括号,表示“一个包含一个列表的列表”。

Kacha
Kacha

KaCha是一款革命性的AI写真工具,用AI技术将照片变成杰作!

下载
b_2d_row = np.array([[7, 1]], dtype=np.dtype(float))
print(f"Array: {b_2d_row}")
print(f"Shape: {b_2d_row.shape}") # Output: (1, 2)
print(f"Dimensions: {b_2d_row.ndim}") # Output: 2

这里,外层方括号表示第一维(行),内层方括号表示第二维(列)。

2.3 三维及更高维数组

创建更高维数组的原理相同,只需增加嵌套方括号的层数。

b_3d = np.array([[[7, 1]]], dtype=np.dtype(float))
print(f"Array: {b_3d}")
print(f"Shape: {b_3d.shape}") # Output: (1, 1, 2)
print(f"Dimensions: {b_3d.ndim}") # Output: 3

在这个例子中,数组有三层嵌套,因此是三维的。形状(1, 1, 2)表示第一个维度有1个元素,第二个维度有1个元素,第三个维度有2个元素。

3. 灵活转换数组形状

有时,我们可能已经有一个一维数组,但需要将其转换为特定的多维形状(例如,将(2,)转换为(1, 2))。NumPy提供了多种方法来实现这一点。

3.1 方法一:直接修改 shape 属性

可以直接修改数组的shape属性来改变其形状。这种方法会原地修改数组。

b_original = np.array([7, 1], dtype=np.dtype(float))
print(f"Original array: {b_original}, Shape: {b_original.shape}")

b_original.shape = (1, 2) # 将形状修改为 (1, 2)
print(f"Modified array: {b_original}, Shape: {b_original.shape}")
# Output:
# Original array: [7. 1.], Shape: (2,)
# Modified array: [[7. 1.]], Shape: (1, 2)

注意事项: 这种方法要求新形状的元素总数必须与原数组的元素总数相同。同时,它会修改原始数组。

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

通过在索引中使用 None 或 np.newaxis,可以在指定位置插入新的维度。这是一种非常灵活且常用的方法。

b_original = np.array([7, 1], dtype=np.dtype(float))
print(f"Original array: {b_original}, Shape: {b_original.shape}")

# 在第一个维度前插入一个新维度,将 (2,) 变为 (1, 2)
b_reshaped_none = b_original[None, :]
print(f"Reshaped with None: {b_reshaped_none}, Shape: {b_reshaped_none.shape}")

# 另一种等效写法,使用 np.newaxis
b_reshaped_newaxis = b_original[np.newaxis, :]
print(f"Reshaped with np.newaxis: {b_reshaped_newaxis}, Shape: {b_reshaped_newaxis.shape}")

# 如果想将 (2,) 变为 (2, 1) (即列向量),则可以这样操作:
b_reshaped_column = b_original[:, None]
print(f"Reshaped to column vector: {b_reshaped_column}, Shape: {b_reshaped_column.shape}")
# Output:
# Original array: [7. 1.], Shape: (2,)
# Reshaped with None: [[7. 1.]], Shape: (1, 2)
# Reshaped with np.newaxis: [[7. 1.]], Shape: (1, 2)
# Reshaped to column vector: [[7.] [1.]], Shape: (2, 1)

使用 None 或 np.newaxis 不会修改原始数组,而是返回

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

相关专题

更多
treenode的用法
treenode的用法

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

529

2023.12.01

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

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

7

2025.12.22

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

61

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

41

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

32

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

198

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号