
numpy数组的维度和形状是其核心概念。本文旨在澄清一维数组`np.array([x, y])`的形状为`(2,)`而非`(1, 2)`的原因,并详细解释numpy如何通过嵌套列表识别数组维度。同时,教程将提供多种实用方法,包括使用`reshape`方法、直接修改`shape`属性以及高级索引技巧,帮助用户灵活创建和转换不同维度的numpy数组。
在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插件,融入众多AI功能和海量素材
128
查看详情
创建三维数组同理,需要三层嵌套列表:
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提供了多种灵活的方法来实现这一目标。
可以直接修改数组的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()方法。
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}") # 原数组未改变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}")这两种高级索引方式提供了非常灵活的维度扩展能力:
理解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版本安装入口