合并NPZ文件问题:现有代码仅保留最后一个文件数据
合并多个NPZ文件的正确方法
你提供的代码之所以只保留最后一个文件的数据,是因为dict.update()会直接覆盖相同键名的条目——后面文件里的同键数组会完全替换掉前面的,根本没做数组拼接。
要真正合并NPZ文件里的数组,需要先收集每个键对应的所有数组,再对数组列表进行拼接,具体实现如下:
import numpy as np import os # 替换成你的NPZ文件所在目录或直接指定文件列表 npz_dir = "./your_npz_directory" file_list = [os.path.join(npz_dir, f) for f in os.listdir(npz_dir) if f.endswith(".npz")] merged_data = {} # 遍历所有文件,按键收集对应数组 for fname in file_list: with np.load(fname) as data: for key, arr in data.items(): if key not in merged_data: merged_data[key] = [] merged_data[key].append(arr) # 对每个键下的数组列表执行拼接 for key in merged_data: # 根据数组的实际维度选择拼接轴(axis),这里默认按第0轴拼接 # 如果是二维数组要按列拼,改成axis=1即可 merged_data[key] = np.concatenate(merged_data[key], axis=0) # 保存合并后的结果 np.savez("merged_all.npz", **merged_data)
注意事项
- 如果不同NPZ文件里的同键数组维度不匹配,
np.concatenate会报错,这时需要先统一数组形状(比如补全维度、调整大小),再用np.vstack/np.hstack等更针对性的拼接方法 - 如果部分NPZ文件缺少某些键,代码会自动忽略,只保留存在该键的文件中的数组进行合并
- 使用
with np.load(...)上下文管理器可以自动关闭文件,避免资源泄漏
内容的提问来源于stack exchange,提问作者Max Fusté Costa
相关产品推荐
相关产品推荐

