信息发布→ 登录 注册 退出

深入理解NumPy数组的维度与形状:从一维到多维的创建与转换

发布时间:2025-11-11

点击量:

深入理解NumPy数组的维度与形状:从一维到多维的创建与转换

numpy数组的维度和形状是其核心概念。本文旨在澄清一维数组`np.array([x, y])`的形状为`(2,)`而非`(1, 2)`的原因,并详细解释numpy如何通过嵌套列表识别数组维度。同时,教程将提供多种实用方法,包括使用`reshape`方法、直接修改`shape`属性以及高级索引技巧,帮助用户灵活创建和转换不同维度的numpy数组。

NumPy数组的维度(ndim)与形状(shape)

在NumPy中,数组的ndim属性表示其维度(或轴的数量),而shape属性则是一个元组,描述了每个维度上的元素数量。理解这两个概念对于高效地处理数值数据至关重要。

考虑以下NumPy数组的创建示例:

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"Number of dimensions of A: {A.ndim}")
print(f"Shape of b: {b.shape}")
print(f"Number of dimensions of b: {b.ndim}")

运行上述代码,将得到以下输出:

Shape of A: (2, 2)
Number of dimensions of A: 2
Shape of b: (2,)
Number of dimensions of b: 1

这里,数组A的形状是(2, 2),表示它是一个2维数组,有2行2列。而数组b的形状是(2,),这表示它是一个1维数组,包含2个元素。许多初学者可能会误认为b的形状应为(1, 2),即1行2列的2维数组。然而,这种理解是不正确的,因为NumPy对维度有着明确的定义。

区分一维数组与二维数组

NumPy通过数组的嵌套层级来识别其维度。

一维数组

当使用一个扁平的列表(或元组)来创建NumPy数组时,NumPy会将其视为一个一维数组。例如,np.array([7, 1])中的[7, 1]是一个包含两个元素的列表,NumPy将其解释为一个具有2个元素的一维数组。因此,其shape为(2,),ndim为1。元组中的逗号表示它是一个元组,而只有一个元素时,如(2,),是Python中表示单元素元组的方式。

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

二维数组

要创建一个二维数组,需要使用嵌套列表。例如,np.array([[7, 1]])中的[[7, 1]]表示一个包含一个列表的列表。外层列表代表行,内层列表代表列。因此,NumPy将其识别为一个2维数组,有1行2列。

b_2d = np.array([[7, 1]], dtype=float)
print(f"b_2d: {b_2d}")
print(f"Shape of b_2d: {b_2d.shape}") # Output: (1, 2)
print(f"Number of dimensions of b_2d: {b_2d.ndim}") # Output: 2

更高维度的数组

千鹿Pr助手 千鹿Pr助手

智能Pr插件,融入众多AI功能和海量素材

千鹿Pr助手 128 查看详情 千鹿Pr助手

创建三维数组同理,需要三层嵌套列表:

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

转换数组的维度

在实际应用中,我们经常需要将现有数组的维度进行转换,以适应不同的计算或数据处理需求。NumPy提供了多种灵活的方法来实现这一目标。

1. 修改 shape 属性(in-place)

可以直接修改数组的shape属性来改变其维度。这种方法会尝试在不复制数据的情况下修改数组的视图,但要求新旧形状的元素总数必须一致。

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

b_original.shape = (1, 2) # 将一维数组转换为二维数组 (1行2列)
print(f"Modified b: {b_original}, shape: {b_original.shape}")

注意事项: 直接修改shape属性是in-place操作,会改变原数组。如果需要保留原数组,应使用reshape()方法。

2. 使用 reshape() 方法

reshape()方法是更推荐的方式,因为它会返回一个具有新形状的数组视图(如果可能),或者一个副本,而不会修改原始数组。这提供了更好的数据完整性控制。

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

b_reshaped = b_original.reshape((1, 2)) # 返回一个新视图,原数组不变
print(f"Reshaped b: {b_reshaped}, shape: {b_reshaped.shape}")
print(f"Original b after reshape: {b_original}, shape: {b_original.shape}") # 原数组未改变

3. 使用高级索引 None 或 np.newaxis

NumPy的None关键字(或其别名np.newaxis)可以在指定位置插入一个新轴,从而增加数组的维度。这在进行广播(broadcasting)操作时特别有用。

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

# 在第一个轴(行)之前插入新轴,将 (N,) 变为 (1, N)
b_newaxis_row = b_original[None, :] # 等同于 b_original[np.newaxis, :]
print(f"b with new row axis: {b_newaxis_row}, shape: {b_newaxis_row.shape}")

# 在现有轴之后插入新轴,将 (N,) 变为 (N, 1)
b_newaxis_col = b_original[:, None] # 等同于 b_original[:, np.newaxis]
print(f"b with new col axis: {b_newaxis_col}, shape: {b_newaxis_col.shape}")

这两种高级索引方式提供了非常灵活的维度扩展能力:

  • array[None, ...] 或 array[np.newaxis, ...]:在最前面(第0轴)添加一个新维度。
  • array[..., None] 或 array[..., np.newaxis]:在最后面添加一个新维度。
  • array[:, None, :]:在中间特定位置添加一个新维度。

总结

理解NumPy数组的ndim和shape属性是掌握NumPy的基础。np.array([x, y])创建的是一个一维数组,其形状为(2,)。要创建二维数组,必须使用嵌套列表,如np.array([[x, y]]),其形状为(1, 2)。通过直接修改shape属性、使用reshape()方法以及None或np.newaxis进行高级索引,我们可以灵活地在不同维度之间转换数组,以适应各种数据处理和计算需求。熟练运用这些技巧,将极大地提升NumPy编程的效率和准确性。

以上就是深入理解NumPy数组的维度与形状:从一维到多维的创建与转换的详细内容,更多请关注其它相关文章!


相关文章: Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  《GTA6》开发画面疑似泄露!这次可不是AI了  深入理解J*a编译器的兼容性选项:从-source到--release  必由学官网快捷入口 必由学网页版在线学习平台  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  内存检查:在VS Code中调试C++时的内存视图  126邮箱账号注册 电脑版登录入口  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  京东单号查询入口_京东快递订单追踪入口  Python模块化编程:有效管理依赖与避免循环引用  J*aScript中如何高效提取对象指定属性  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  WooCommerce产品页高级定制:实现基于分类的交叉销售  J*aScript DOM操作:高效清空列表元素的策略与实践  必由学在线入口 必由学网页版快速登录入口  解决Flask中Quill编辑器内容提交失败及TypeError的指南  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  微信网页版官方入口直达 微信网页版网页版登录使用方法  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  小米14应用无法联网原因分析_小米14网络权限修复  steam官方入口大全 steam账号注册及操作指南  蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  字由网在线版登录地址 字由网网页版安全入口  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  excel怎么提取文本中数字 excel函数提取技巧  蛙漫安全无毒 官方认证的绿色入口  PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  12306几点到几点不能订票? | 官方最新系统维护时间全解析  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  Animex动漫社网入口地址 Animex动漫社网正版在线入口  Eclipse怎么运行工程_Eclipse工程运行配置说明  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  outlook中文官网入口地址 outlook官方中文版直达首页链接  顺丰快件物流信息 官方网站查询入口  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  c++ dfs和bfs代码 c++深度广度优先搜索算法  qq游戏手机版下载安装_qq游戏移动端入口  期待已久:小米17 Ultra、小米首款NAS本月登场  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  星露谷物语官网入口 星露谷物语游戏官网入口  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!