NumPy Ndarray 对象¶
numpy.ndarray 是固定维数、同构元素组成的多维容器。它将一块数据缓冲区与形状、数据类型、步长等元数据结合,使切片、转置和批量计算不必逐个处理 Python 对象。
核心结构¶
数组的重要组成包括:
| 内容 | 说明 |
|---|---|
| data | 原始元素所在的内存缓冲区 |
dtype |
每个元素的解释方式和字节数 |
shape |
各维长度 |
strides |
每一维前进一步需要跨过的字节数 |
ndim |
维度数量 |
通常通过 np.array 等工厂函数创建数组,而不是直接调用 np.ndarray 构造器。
可运行示例¶
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32)
print(type(a))
print(a.shape, a.dtype, a.strides)
# 通用函数按元素工作,聚合函数可指定轴。
print(np.square(a))
print(a.sum(axis=0))
# 转置通常只改变元数据并共享缓冲区。
t = a.T
t[0, 0] = 99
print(a)
print(np.shares_memory(a, t))
数组与 Python 序列¶
Python 列表可保存不同类型对象,+ 表示拼接;数组通常保存同一 dtype,+ 表示逐元素加法。数组维度必须规则,不能把参差不齐的嵌套列表直接当作普通二维数值数组。
常见错误与性能注意事项¶
ndarray同构不等于值不可变;dtype 固定,但元素可以修改。a * b是逐元素乘法,矩阵乘法使用a @ b或np.matmul。object数组保存 Python 对象指针,计算通常回到 Python 层,速度和内存效率显著下降。- 非连续数组可以正常参与多数运算,但传给本地库时可能触发隐式复制;用
flags检查布局。 - 不要用
if a:判断多元素数组,语义不明确会抛出异常;根据意图使用a.any()、a.all()或a.size > 0。 - 公开函数参数应说明预期 shape 和 dtype,并在边界处用
np.asarray规范输入。