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

心靈之曲
发布: 2025-11-10 13:00:04
原创
954人浏览过

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 二维数组

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

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

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

飞书多维表格 26
查看详情 飞书多维表格
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 不会修改原始数组,而是返回

以上就是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号