新闻中心

深入理解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数组的维度与形状:从一维到多维的创建与转换的详细内容,更多请关注其它相关文章!


# 旧版本  # 新北方网站建设大学  # 信阳抖音搜索seo  # seo-joon park  # 余杭区推广网站外包  # 罗湖区网站开发价格优化  # 不懂营销和推广  # 房地产东莞网站建设  # 站长之家seo综合查询  # seo微信公众号文章  # 银川seo优化排名  # python  # 是一个  # 运算符  # 的是  # 显存  # 数据处理  # 创建一个  # 它是  # 将其  # 多维 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  html5 app怎么运行环境_配html5 app运行环境【教程】  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  c++如何使用Meson构建系统_c++比CMake更快的构建工具  抖音网页版平台入口 抖音网页版官网在线访问教程  2025-2030年全球乘用车销量预测:新能源成增长主力  在Typer应用中优雅地处理和重组任意命令行参数  Archive of Our Own官网直达 AO3最新可用地址一览  Angular中父组件异步更新子组件复选框状态的实践指南  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  极兔快递快件信息查询系统 极兔快递官网运单号追踪  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  PDF文件体积过大处理_PDF压缩技巧详解  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  mc.js游戏直达 mc.js网页免下载版本秒进地址  使用J*aScript检测输入元素是否包含在特定类中  抖音创作助手登录入口_抖音创作辅助工具官网直达  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  Pandas DataFrame 多条件优先级排序与排名  composer的"require-dev"部分是用来做什么的?  QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  离线运行Go语言之旅:本地部署与GOPATH配置指南  如何提高微信支付的安全性_微信支付安全防护与设置建议  2026年CSGO开箱网站推荐 CSGO开箱平台精选  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  Android Studio计算器C键功能异常排查与修复教程  在Socket.IO连接中实现Access Token自动更新与动态重连  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  Lar*el Form Request中唯一性验证在更新操作中的正确实现  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  在Qt QML中通过Python字典动态更新TextEdit内容的教程  CSS实现侧边栏导航项全宽圆角悬停背景效果  将HTML Canvas内容转换为可上传的图像文件(File对象)  微信网页版扫码登录入口 微信网页版二维码登录入口  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  小米14应用无法联网原因分析_小米14网络权限修复 

搜索