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

花韻仙語
发布: 2025-11-11 11:36:02
原创
701人浏览过

深入理解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
登录后复制

更高维度的数组

飞书多维表格
飞书多维表格

表格形态的AI工作流搭建工具,支持批量化的AI创作与分析任务,接入DeepSeek R1满血版

飞书多维表格 26
查看详情 飞书多维表格

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

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

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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