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

如何混合/交错两个.npy文件中的数组内容?

解决方案

可以用Python的numpy库高效实现需求,以下是具体步骤和代码:

核心思路

  1. 将原两个数组分别拆分为前50万行和后50万行(原数组共100万行,拆分后每部分50万行);
  2. 把第一个数组的前半部分与第二个数组的前半部分交错排列,组成第一个新文件;
  3. 把第一个数组的后半部分与第二个数组的后半部分交错排列,组成第二个新文件;
    这样既保证总数据量和文件大小不变,又实现了交错分配的要求。

常规代码实现

import numpy as np

# 1. 加载原npy文件
arr1 = np.load("original_file1.npy")
arr2 = np.load("original_file2.npy")

# 2. 拆分原数组为前后两半
split_idx = arr1.shape[0] // 2  # 结果为500000
arr1_part1, arr1_part2 = np.split(arr1, [split_idx])
arr2_part1, arr2_part2 = np.split(arr2, [split_idx])

# 3. 交错排列:偶数索引行取第一个数组的对应部分,奇数索引行取第二个数组的对应部分
new_arr1 = np.empty((arr1.shape[0], arr1.shape[1]), dtype=arr1.dtype)
new_arr1[::2] = arr1_part1
new_arr1[1::2] = arr2_part1

new_arr2 = np.empty((arr1.shape[0], arr1.shape[1]), dtype=arr1.dtype)
new_arr2[::2] = arr1_part2
new_arr2[1::2] = arr2_part2

# 4. 保存为新的npy文件
np.save("new_file1.npy", new_arr1)
np.save("new_file2.npy", new_arr2)

内存优化方案

如果机器内存不足以一次性加载两个100万行的数组,可以采用分块处理的方式,每次处理一小部分数据并逐步写入文件:

import numpy as np

chunk_size = 10000  # 每次处理1万行,可根据内存调整
total_rows = 1000000
split_idx = total_rows // 2
dtype = np.float32  # 替换为你实际数组的数据类型
cols = 833  # 保持和原数组列数一致

# 用内存映射文件逐块读写,避免占用过多内存
with np.lib.format.open_memmap("new_file1.npy", mode="w+", dtype=dtype, shape=(total_rows, cols)) as new_arr1, \
     np.lib.format.open_memmap("new_file2.npy", mode="w+", dtype=dtype, shape=(total_rows, cols)) as new_arr2, \
     np.lib.format.open_memmap("original_file1.npy", mode="r", dtype=dtype, shape=(total_rows, cols)) as arr1, \
     np.lib.format.open_memmap("original_file2.npy", mode="r", dtype=dtype, shape=(total_rows, cols)) as arr2:

    # 处理前半部分,写入new_file1
    for i in range(0, split_idx, chunk_size):
        end = min(i + chunk_size, split_idx)
        new_arr1[i*2 : end*2 : 2] = arr1[i:end]
        new_arr1[i*2+1 : end*2+1 : 2] = arr2[i:end]

    # 处理后半部分,写入new_file2
    for i in range(split_idx, total_rows, chunk_size):
        end = min(i + chunk_size, total_rows)
        rel_i = i - split_idx
        rel_end = end - split_idx
        new_arr2[rel_i*2 : rel_end*2 : 2] = arr1[i:end]
        new_arr2[rel_i*2+1 : rel_end*2+1 : 2] = arr2[i:end]

结果验证

可以随机抽取部分行验证结果是否符合预期:

new_arr1 = np.load("new_file1.npy")
arr1 = np.load("original_file1.npy")
arr2 = np.load("original_file2.npy")

# 验证new_file1第0行是原file1第0行,第1行是原file2第0行
print(np.array_equal(new_arr1[0], arr1[0]))  # 输出应为True
print(np.array_equal(new_arr1[1], arr2[0]))  # 输出应为True

# 验证new_file2第0行是原file1第500000行,第1行是原file2第500000行
new_arr2 = np.load("new_file2.npy")
print(np.array_equal(new_arr2[0], arr1[500000]))  # 输出应为True
print(np.array_equal(new_arr2[1], arr2[500000]))  # 输出应为True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:30:17