本系列是《NumPy 速通》的配套章节。
拿到一个数组,第一件事往往是"体检":它多大?几维?里面是什么类型?这四个属性搞明白,后面所有广播、axis、运算的坑都能绕开一大半。
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr.shape # (2, 3) 每个维度的大小
arr.ndim # 2 维度数量
arr.size # 6 元素总个数
arr.dtype # int64 元素的数据类型
arr.itemsize # 8 每个元素占多少字节
arr.nbytes # 48 整个数组占多少字节(size × itemsize)
shape —— 形状(最重要)
(2, 3) 表示 2 行 3 列。一切数组运算的前提都是搞清楚 shape——广播、axis、reshape 全围绕它转。
np.array([1, 2, 3]).shape # (3,) 一维,注意结尾逗号!
np.array([[1, 2, 3]]).shape # (1, 3) 一行三列
np.array([[1], [2], [3]]).shape # (3, 1) 三行一列
np.zeros((2, 3, 4)).shape # (2, 3, 4) 三维
⚠️ 灵魂警告:
(3,)和(3, 1)和(1, 3)长度都写"3",但完全不同——一个是向量,一个是列,一个是行。这直接决定广播行为(第 8 章)。看到 shape 时永远要留意是不是一维。
一维的 (5,) 为什么带逗号?因为 (5) 会被 Python 当成普通整数 5,逗号是为了表示"这是元组,只有一个维度"。
ndim —— 维度数
ndim 就是 len(shape):
np.array([1, 2, 3]).ndim # 1
np.array([[1, 2], [3, 4]]).ndim # 2
- 1 维:向量
- 2 维:矩阵 / 表格
- 3 维:一批矩阵(如图像的 RGB 三通道)
- 4、5 维:深度学习 batch 里的 tensor 常见
size —— 元素总数
size 就是 shape 所有维度之积:2 × 3 = 6。
arr.size # 6
np.prod(arr.shape) # 6 (shape 各维相乘,等价)
size 常用来判断"reshape 合不合法"(第 5 章:元素总数不变才能 reshape)。
dtype —— 数据类型(含溢出)
数组所有元素必须同一类型,这正是它快的原因。常见 dtype:
| dtype | 含义 | 范围 |
|---|---|---|
int8 / int16 / int32 / int64 |
整数 | 有符号,位数越多范围越大 |
uint8 / uint32 |
无符号整数 | 图片像素常用 uint8(0-255) |
float16 / float32 / float64 |
浮点数 | float64 也叫 double |
bool |
布尔值 | True / False |
complex64 / complex128 |
复数 | 信号处理、FFT 用 |
object |
任意 Python 对象 | 慢,尽量避免 |
str_ / U... |
字符串 | 如 U10 = 最长 10 字符的 Unicode |
创建时指定 / 事后转换
np.array([1, 2, 3], dtype=np.float64) # 创建时指定
arr = np.array([1, 2, 3])
arr.astype(np.float64) # 返回新数组,转浮点 → [1. 2. 3.]
arr.astype(bool) # [True True True]
arr.astype(str) # ['1' '2' '3']
astype 返回新数组,不改原数组(除非 copy=False 且能原地转)。
⚠️ 类型转换的坑
np.array([1.9, 2.7]).astype(int) # [1 2] 截断,不是四舍五入!
np.array([-1, 0, 1]).astype(np.uint8) # [255 0 1] 负数绕回大数!
np.array([2**63 - 1], dtype=np.int64) + 1 # 静默溢出成负数
三个坑:float→int 是截断不是四舍五入;无符号类型放负数会绕圈;固定位宽整数会溢出。都需要小心。
内存相关:itemsize / nbytes / strides
arr = np.zeros((1000, 1000), dtype=np.float64)
arr.nbytes # 8,000,000 = 8MB
arr.itemsize # 8 字节
arr.strides # (8000, 8) 每跨一个维度要跳多少字节
nbytes:估内存占用,大数据集建模前先看这个strides:进阶概念,理解它才能懂视图/转置为何"零成本"
小结
| 属性 | 含义 |
|---|---|
shape |
每维大小,一切运算的地基 |
ndim |
维度数 = len(shape) |
size |
元素总数 = 各维乘积 |
dtype |
元素类型,决定精度与内存 |
itemsize / nbytes |
字节数,估内存用 |
先看 shape,再看 dtype——这是拿到陌生数组时的标准动作。下一章学怎么从数组里"取东西"。
上一篇:第 1 章 创建数组 | 下一篇:第 3 章 索引与切片