You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环合并numpy.npy文件切片2D数组时仅保存奇数序号文件的问题

问题原因

脚本出现偶数编号文件缺失、结果不符合预期,是多处逻辑错误共同导致的:

    1. 重复删除变量触发程序崩溃
      你在if分支内完成切片后就执行了del my_arr,但if分支结束后固定还有一行del my_arr。当if条件成立时,第二次删除不存在的my_arr会直接抛出NameError导致程序意外终止,根本无法跑完所有循环。
    1. 输出文件索引计数逻辑错误
      存完第一个(奇数编号)文件后,你先执行m = m + 1把编号加到偶数位,但进入if分支准备存第二个文件时,又提前执行了一次m = m + 1,直接跳过偶数编号,把本该存为test_2.npy的内容存到了奇数编号下,直接造成偶数文件缺失。
    1. 切片索引计算错误,无法得到符合形状要求的数组
      单个文件500行、每段切片432行,两个文件垂直堆叠共1000行,实际只能切出2段完整的432行切片:第一段0-432行,第二段432-864行,剩余136行需要和下一个文件拼接才能凑够下一段。但你在切第二段前错误多执行了一次k = k + 1,导致切片起始位置跳到864行,切出来的数组只有136行,完全不符合(432,55)的形状要求。
    1. 循环步进逻辑错误,会引发索引越界
      你用for n in range(no_files)遍历,每次循环都取filelist[n+1]作为第二个文件:
    • 当n遍历到最后一个文件(n=99)时,n+1=100超出列表长度,直接触发索引越界错误
    • 每次循环n只加1,会导致同一个文件被重复加载两次(上一轮的f2会成为下一轮的f1),和你每次仅加载2个文件的需求不符,还会造成切片位置计算完全错位。
  • 额外隐患:glob路径写法错误
    你写的路径是'/**array_*.npy',如果调用glob.glob()时不传入recursive=True参数,**通配符不会递归匹配子目录,很容易出现文件漏匹配的问题。
修正后代码

优化后逻辑通过缓存残段的方式控制内存占用,每次仅新加载1个文件,内存中最多同时存在不足432行的残段+1个完整文件,总大小小于2个完整文件,符合加载限制,同时不会出现编号跳变、索引越界问题:

import numpy as np
import os, glob, re
import time

# 如需递归匹配子目录,记得加recursive=True参数
path = './array_*.npy'  # 替换为实际文件路径
filenames = [os.path.basename(x) for x in glob.glob(path, recursive=True)]
filelist = sorted(filenames, key=lambda x:float(re.findall("(\d+)",x)[0]))
no_files = len(filelist)
t0 = time.time()

daily_data = 432
one_file_data = 500
output_idx = 1
# 缓存上一次拼接后剩余的、不足432行的残段
buffer = None

for file in filelist:
    arr = np.load(file)
    print(f'Loaded file: {file}, array shape: {arr.shape}')
    # 将新加载的数组合并到缓存
    if buffer is None:
        buffer = arr
    else:
        buffer = np.vstack((buffer, arr))
    # 缓存长度足够时循环切出完整段保存
    while len(buffer) >= daily_data:
        segment = buffer[:daily_data, :]
        np.save(f'test_{output_idx}.npy', segment)
        print(f'Saved test_{output_idx}.npy, segment shape: {segment.shape}, time spent: {time.time()-t0:.2f}s')
        # 剩余部分留在缓存等待和下一个文件拼接
        buffer = buffer[daily_data:, :]
        output_idx += 1

# 所有文件处理完后如果缓存还有剩余,可按需求补零凑数或直接丢弃
# if len(buffer) > 0:
#     pass

内容的提问来源于stack exchange,提问作者CEB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:06:25