不是必须手动加,np.save() 会自动添加 .npy 后缀,若传入"file.npy"则生成"file.npy.npy";正确写法是np.save("file", arr)生成"file.npy"。

用 np.save() 保存数组时,文件后缀必须是 .npy 吗?
不是必须手动加,但 np.save() 会自动补上 .npy 后缀——哪怕你写了 np.save("data.npy", arr),它最终存的还是 data.npy.npy。这是新手最常踩的坑。
- 正确写法:
np.save("data", arr)→ 生成data.npy - 错误写法:
np.save("data.npy", arr)→ 生成data.npy.npy(多了一层后缀) - 路径里含目录时,确保父目录已存在,
np.save()不会自动创建目录 - 如果想控制文件名完全精确(比如带时间戳),用
np.save("data_20240501.npy", arr)是错的;应该先去掉后缀:np.save("data_20240501", arr)
np.load() 打不开刚保存的 .npy 文件?检查这三件事
常见报错像 OSError: Failed to interpret file 或直接提示“not a valid npy file”,往往不是文件损坏,而是路径或模式问题。
- 确认文件确实是
np.save()写出的,不是用np.savetxt()或文本编辑器改过内容 - 检查路径是否拼错,尤其 Windows 下反斜杠
\容易被当转义符,建议统一用正斜杠/或原始字符串r"path\to\data.npy" -
np.load()默认以只读方式打开,但如果文件被其他进程占用(比如用记事本打开了 .npy),会失败——.npy 是二进制格式,别用文本编辑器碰它
保存多个数组:别硬套 np.save(),改用 np.savez() 或 np.savez_compressed()
np.save() 一次只能存一个数组,想打包多个就得换函数。否则容易写出一堆零散 .npy 文件,管理混乱。
-
np.savez("archive.npz", a=arr1, b=arr2, c=arr3)→ 存成压缩包,支持按 key 读取 -
np.savez_compressed()体积更小,适合大数组,但加载稍慢一点 - 读取时用
np.load("archive.npz")返回一个类似字典的对象,data["a"]才拿到对应数组 - 注意:
.npz文件不能用np.load()直接读成单个数组,会报ValueError: Cannot load file containing pickled data
跨 Python 版本或 NumPy 版本读写 .npy 文件安全吗?
基本安全,但有边界情况:老版本 NumPy(
- 如果目标环境 NumPy 较老(比如 1.13),保存时显式指定协议:
np.save("data.npy", arr, allow_pickle=True)并确保protocol=2(Python 2 兼容)或protocol=3(Python 3.4+) - 含自定义对象或函数的数组(用了
allow_pickle=True)有安全风险,生产环境尽量避免 - 纯数值数组(int/float/bool)基本无兼容问题,放心用
np.save() 和 np.load() 就容易卡在第一步。








