如何混合/交错两个.npy文件中的数组内容?
解决方案
可以用Python的numpy库高效实现需求,以下是具体步骤和代码:
核心思路
- 将原两个数组分别拆分为前50万行和后50万行(原数组共100万行,拆分后每部分50万行);
- 把第一个数组的前半部分与第二个数组的前半部分交错排列,组成第一个新文件;
- 把第一个数组的后半部分与第二个数组的后半部分交错排列,组成第二个新文件;
这样既保证总数据量和文件大小不变,又实现了交错分配的要求。
常规代码实现
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
相关产品推荐
相关产品推荐

