应使用 np.zeros() 和 np.ones() 创建数组,因其高效、安全且符合 numpy 设计;避免 python 原生嵌套列表构造(如 [[0]n]m),因其浅拷贝、无向量化、易出错;务必显式指定 dtype,并用 tuple 传 shape。

直接用 np.zeros() 和 np.ones(),别写循环或列表推导式——这是最高效、最符合 NumPy 设计意图的方式。
为什么不用 np.array([[0]*n]*m) 这类 Python 原生构造?
这种写法表面看能生成二维零数组,但本质是浅拷贝:所有行引用同一列表对象。修改 a[0][0] 会意外改变整列;更严重的是,它绕过了 NumPy 的底层 C 内存分配,完全丧失向量化优势。
常见错误现象:ValueError: setting an array element with a sequence(当你后续尝试赋值非标量时)、内存占用翻倍、运行速度比 np.zeros() 慢 10 倍以上。
实操建议:
- 永远避免用嵌套
[...]*n或[[0]*n for _ in range(m)]构造多维数组 - 如果必须从 Python 容器起步,至少用
np.array(..., dtype=float)显式指定类型,但仍是次选 -
np.zeros((3, 4))比np.array([[0,0,0,0]]*3)更安全、更快、内存更紧凑
dtype 参数不设默认值可能踩坑
NumPy 默认用 float64,但很多场景只需要 int32、bool 或 float32。不显式指定不仅浪费内存(比如图像处理中用 float64 存二值掩码),还可能引发隐式类型转换错误。
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
使用场景与参数差异:
- 布尔型全一数组:
np.ones((1000, 1000), dtype=bool)—— 比默认float64节省 8 倍内存 - 索引用整数数组:
np.zeros(10000, dtype=np.int32)—— 避免后续arr[idx] = ...时类型不匹配警告 - 深度学习输入占位:
np.zeros((32, 224, 224, 3), dtype=np.float32)—— 匹配模型权重精度,防止自动升为float64
大数组初始化时,np.empty() + 原地填充是否更快?
对超大规模数组(如 >1GB),np.zeros() 会清零全部内存页,而 np.empty() 只分配不初始化。如果你紧接着就要整体赋值(比如 a[:] = 0 或 a[:] = 1),理论上 np.empty() 略快——但差距通常在毫秒级,且易引入未定义行为(若忘记赋值,内容是随机内存垃圾)。
实操建议:
- 除非在性能敏感内核里反复调用且已确认瓶颈在此,否则坚持用
np.zeros()/np.ones() - 绝不要用
np.empty()后只部分赋值(如a[0] = 1),其余元素仍是脏数据 - 注意:
np.full((n,), 0)功能等价于np.zeros(n),但多一次 Python 层解析,略慢
最容易被忽略的点:形状参数必须是 tuple,不是 int 列表(np.zeros([3,4]) 虽然能跑,但触发了不推荐的隐式转换;应写成 np.zeros((3,4)))。还有,np.zeros_like() 和 np.ones_like() 在复用已有数组 dtype/shape 时极有用,但别误传标量进去——np.zeros_like(5) 返回的是 shape=() 的 0,不是你想的长度为 1 的数组。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










