本系列是《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 章 索引与切片