🧮 一文讲透 NumPy 的 ndarray:概念 · 原理 · 用法(新手友好版)
如果你刚开始学数据科学、机器学习或数值计算,那 NumPy 的 ndarray
就是你必须掌握的第一块基石!
下面我会用通俗易懂 + 循序渐进 + 实例驱动的方式,帮你彻底搞懂:
✅ 什么是 ndarray?
✅ 它为什么快?
✅ 它能做什么?
✅ 怎么用它?
✅ 以及那个让人困惑的
.ndim
到底是什么意思?
准备好了吗?我们开始!
🌟 一、ndarray 是什么?
ndarray 是 NumPy 库最核心的数据结构,全称是 N-dimensional array(N维数组)。
你可以把它想象成:
💡 一个"整齐划一、多层嵌套、类型统一"的数据容器。
举个生活化的例子:
维度 | 类比对象 | 例子 |
---|---|---|
0维 | 一个数字(标量) | np.array(42) |
1维 | 一行数字(向量) | np.array([1,2,3]) |
2维 | 一张表格(矩阵) | np.array([[1,2],[3,4]]) |
3维 | 一叠表格(张量) | 比如彩色图像:高×宽×通道 |
📌 一句话记住:ndarray 就是"带维度的表格",而且所有格子里的数据类型必须一样!
🧠 二、为什么 ndarray 这么快?------三大核心原理
1️⃣ 同类型数据(Homogeneous)
ndarray 中所有元素必须是同一数据类型(比如全是整数或全是浮点数)。
✅ 优点:内存紧凑、CPU 可批量处理 → 速度飞快
❌ 缺点:不能像 Python 列表那样混装字符串、数字、对象等
python
import numpy as np
arr = np.array([1, 2, 3]) # ✅ 整数 → 自动用 int32/int64
arr = np.array([1, 2.0, 3]) # ✅ 自动统一为 float64 → [1.0, 2.0, 3.0]
arr = np.array([1, "hello", 3]) # ⚠️ 虽不报错,但全转成字符串 → 效率暴跌!
2️⃣ 连续内存 + 固定大小
数据在内存中是连续存放的,且创建后大小通常固定(除非显式调整)。
✅ 优点:CPU 缓存友好,支持 SIMD 向量化运算 → 秒杀 Python 列表
3️⃣ 维度结构:shape 与 axis
shape
:描述每一维的大小,如(2, 3)
表示 2 行 3 列axis
:操作方向,axis=0
是"跨行"(纵向),axis=1
是"跨列"(横向)
python
arr = np.array([[1, 2, 3],
[4, 5, 6]])
print(arr.shape) # → (2, 3) :2行3列
print(arr.ndim) # → 2 :这是个"2阶数组"(或说"二维数组")
❓ 三、重点答疑:ndarray.ndim 到底是什么?
你可能在文档或教程里看到:
ndarray.ndim
------ 数组的维数(有时被称作"秩/rank")
⚠️ 注意:"秩"这个词容易引起混淆!我们建议统一使用"阶"或"维数"。
🧩 通俗理解:"阶" = "有几层中括号"
想快速判断一个数组是几阶?数一数它有几层方括号 []
!
python
import numpy as np
a = np.array(42) # 0 层 → 0 阶(标量)
b = np.array([1, 2, 3]) # 1 层 → 1 阶(向量)
c = np.array([[1, 2], [3, 4]]) # 2 层 → 2 阶(矩阵)
d = np.array([[[1]], [[2]]]) # 3 层 → 3 阶(张量)
print(a.ndim) # 0
print(b.ndim) # 1
print(c.ndim) # 2
print(d.ndim) # 3
📌 记忆口诀:
数括号,定阶数 ------ 几层括号,就是几阶!
📐 数学视角:张量的"阶"
在数学/物理中,ndarray 本质是张量(Tensor):
对象 | 阶数 | NumPy 示例 | 索引方式 |
---|---|---|---|
标量 | 0 | np.array(5) |
无索引 |
向量 | 1 | np.array([1,2,3]) |
arr[0] |
矩阵 | 2 | np.array([[1,2],[3,4]]) |
arr[0,1] |
3阶张量 | 3 | 图像、视频、批次数据 | arr[i,j,k] |
✅ 所以:
ndim
表示的是"张量的阶数",即"访问一个元素需要几个索引"。
⚠️ 重要区分:不要和"矩阵的秩"搞混!
英文中 "rank" 是个多义词,在不同场景含义完全不同:
场景 | 英文术语 | 中文推荐术语 | 含义 |
---|---|---|---|
NumPy 维度 | rank / order | 阶 或 维数 | 数组有几维(ndim) |
线性代数 | matrix rank | 秩 | 矩阵线性无关行/列的最大数量 |
排序 | ranking | 排名 | 如 pandas 的 .rank() 方法 |
python
arr = np.array([[1, 2],
[2, 4]])
print(arr.ndim) # → 2 (这是"阶")
print(np.linalg.matrix_rank(arr)) # → 1 (这是"秩",因两行线性相关)
📌 教学建议:
在讲解或写作时,请用 "阶" 或 "维数" 描述
ndim
,避免使用"秩",防止初学者混淆!
📌 术语统一提醒:
请用 "阶" 或 "维数" 描述
ndim
,把 "秩" 留给线性代数中的
matrix_rank
,让术语各归其位,学习事半功倍!