彻底掌握NumPy维度、轴与秩的核心概念(附视觉化图解+代码实战)

🔍 从三维空间坐标到高维操作,一次搞懂axis的底层逻辑


🧠 1. 维度 = 轴!图解NumPy最烧脑的三大概念

📚 核心参考图解NumPy:理解数组最形象的教程

1.1 概念三剑客:Dimension/Axis/Rank

在NumPy中,维度(dimension)就是轴(axes)!二者完全等价,就像现实世界用坐标轴描述位置。而秩(rank)就是轴的数量,即维度数量。

💡 关键结论

  1. 维度数 = 轴数量 = 秩
  2. 轴的本质是数据组织的方向

1.2 现实世界 vs NumPy轴的映射关系

现实空间 坐标轴构成 定位方式 NumPy对应轴
一维(直线) 单x轴 (x) axis=0
二维(平面) x轴+y轴 (x,y) axis=0,1
三维(立体) x+y+z轴 (x,y,z) axis=0,1,2
四维(时空) x+y+z+时间轴 (x,y,z,t) axis=0,1,2,3

🧩 2. 三维数组解剖:用坐标轴思想彻底理解操作

2.1 可视化三维数组结构

下图是典型的 (3,2,4) 三维数组,像搭积木一样分层组织:

三维数组轴结构

用代码构建并观察它的形态:

1
2
3
4
5
6
7
8
9
10
11
"""
numpy 数组维度理解

Version: 1.0
Author: Penry
"""

import numpy as np

a = np.arange(24).reshape(3,2,4)
a

运行结果

三维数组输出

2.2 数组特征快速诊断

1
2
3
4
5
6
7
8
9
10
11
12
13
"""
numpy 数组维度理解

Version: 1.1
Author: Penry
"""

import numpy as np

a = np.arange(24).reshape(3,2,4)
print(f'数组a的维度为:{a.ndim}')
print(f'数组a的形状为:{a.shape}')
print(f'数组a的元素个数为:{a.size}')

输出效果

数组特征输出


⚡ 3. 轴操作实战:sum函数中的维度压缩(图解+公式)

3.1 沿axis=0求和(压缩x轴)

1
2
3
4
5
6
7
8
9
10
11
"""
numpy 数组维度理解

Version: 1.2
Author: Penry
"""

import numpy as np

a = np.arange(24).reshape(3,2,4)
print(a.sum(axis=0))

效果

axis0求和结果

数学本质
固定y,z坐标,叠加所有x层的值:

Result[y][z]=x=02a[x][y][z]Result[y][z] = \sum_{x=0}^{2} a[x][y][z]

[a000+a100+a200a001+a101+a201a002+a102+a202a003+a103+a203a010+a110+a210a011+a111+a211a012+a112+a212a013+a113+a213]\begin{bmatrix} a_{000}+a_{100}+a_{200} & a_{001}+a_{101}+a_{201} & a_{002}+a_{102}+a_{202} & a_{003}+a_{103}+a_{203} \\ a_{010}+a_{110}+a_{210} & a_{011}+a_{111}+a_{211} & a_{012}+a_{112}+a_{212} & a_{013}+a_{113}+a_{213} \\ \end{bmatrix}

形状变化:(3,2,4) ➔ (2,4) (去掉了x轴)


3.2 沿axis=1求和(压缩y轴)

1
2
3
4
5
6
7
8
9
10
11
"""
numpy 数组维度理解

Version: 1.3
Author: Penry
"""

import numpy as np

a = np.arange(24).reshape(3,2,4)
print(a.sum(axis=1))

效果

axis1求和结果

数学本质
固定x,z坐标,叠加所有y行的值:

Result[x][z]=y=01a[x][y][z]Result[x][z] = \sum_{y=0}^{1} a[x][y][z]

[a000+a010a001+a011a002+a012a003+a013a100+a110a101+a111a102+a112a103+a113a200+a210a201+a211a202+a212a203+a213]\begin{bmatrix} a_{000}+a_{010} & a_{001}+a_{011} & a_{002}+a_{012} & a_{003}+a_{013} \\ a_{100}+a_{110} & a_{101}+a_{111} & a_{102}+a_{112} & a_{103}+a_{113} \\ a_{200}+a_{210} & a_{201}+a_{211} & a_{202}+a_{212} & a_{203}+a_{213} \\ \end{bmatrix}

形状变化:(3,2,4) ➔ (3,4) (去掉了y轴)


3.3 沿axis=2求和(压缩z轴)

1
2
3
4
5
6
7
8
9
10
11
"""
numpy 数组维度理解

Version: 1.4
Author: Penry
"""

import numpy as np

a = np.arange(24).reshape(3,2,4)
print(a.sum(axis=2))

效果

axis2求和结果

数学本质
固定x,y坐标,叠加所有z列的值:

Result[x][y]=z=03a[x][y][z]Result[x][y] = \sum_{z=0}^{3} a[x][y][z]

[a000+a001+a002+a003a010+a011+a012+a013a100+a101+a102+a103a110+a111+a112+a113a200+a201+a202+a203a210+a211+a212+a213]\begin{bmatrix} a_{000}+a_{001}+a_{002}+a_{003} & a_{010}+a_{011}+a_{012}+a_{013} \\ a_{100}+a_{101}+a_{102}+a_{103} & a_{110}+a_{111}+a_{112}+a_{113} \\ a_{200}+a_{201}+a_{202}+a_{203} & a_{210}+a_{211}+a_{212}+a_{213} \\ \end{bmatrix}

形状变化:(3,2,4) ➔ (3,2) (去掉了z轴)


💎 4. 终极规律:秒算任意轴操作后的形状

形状变化公式(超实用!)

操作后的形状 = 原始形状移除该轴

操作方式 原始shape 指定axis 结果shape
sum(axis=0) (3,2,4) 0 (2,4)
sum(axis=1) (3,2,4) 1 (3,4)
max(axis=2) (3,2,4) 2 (3,2)
mean(axis=1) (5,3,6) 1 (5,6)

黄金法则
对axis=n执行操作后,结果数组的shape就是 原始shape去掉第n个维度


🚀 5. 举一反三挑战

❓ 对于四维数组 arr.shape=(2,5,3,4)

  1. arr.sum(axis=1).shape = ?
  2. arr.mean(axis=(0,2)).shape = ?

💡 提示:多个轴操作时,同时移除对应维度

🗺️ 5.1 代码验证

创建四维数组并验证形状:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
"""
numpy 数组维度理解

Version: 1.5
Author: Penry
"""

import numpy as np

# 创建形状为(2,5,3,4)的四维数组(用数字0-119填充)
arr = np.arange(120).reshape(2,5,3,4)

print("原始数组形状:", arr.shape)
print("总元素数:", arr.size)

输出结果:

alt text

这里我们也将数组 arrarr 展示如下:

alt text

arr.sum(axis=1)操作结果可视化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"""
numpy 数组维度理解

Version: 1.6
Author: Penry
"""

import numpy as np

# 创建形状为(2,5,3,4)的四维数组(用数字0-119填充)
arr = np.arange(120).reshape(2,5,3,4)

# 沿着axis=1求和
result = arr.sum(axis=1)
print(result)

输出结果:

alt text

arr.mean(axis=(0,2))操作结果可视化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"""
numpy 数组维度理解

Version: 1.7
Author: Penry
"""

import numpy as np

# 创建形状为(2,5,3,4)的四维数组(用数字0-119填充)
arr = np.arange(120).reshape(2,5,3,4)

# 沿着axis=0和axis=2求平均值
result = arr.mean(axis=(0,2))
print(result)

输出结果:

alt text

🧮 数学原理拆解:

  1. arr.sum(axis=1)

Result[x][w][z]=y=04arr[x][y][w][z]Result[x][w][z] = \sum_{y=0}^{4} arr[x][y][w][z]

形状变化:(2,5,3,4) ➔ (2,3,4) (去掉了y轴)
其中:

  • x 遍历轴0 (0-1)
  • w 遍历轴2 (0-2)
  • z 遍历轴3 (0-3)
  1. arr.mean(axis=(0,2))

Result[y][z]=123x=01w=02arr[x][y][w][z]Result[y][z] = \frac{1}{2*3} \sum_{x=0}^{1} \sum_{w=0}^{2} arr[x][y][w][z]

形状变化:(2,5,3,4) ➔ (5,4) (去掉了x和w轴)
其中:

  • y 遍历轴1 (0-4)
  • z 遍历轴3 (0-3)