如何通过索引数组高效从含NumPy数组的主列表批量提取元素
NumPy百万级索引高效实现方案
方案1:预拼接+偏移索引(性能最优,推荐)
核心逻辑是把分散的数组合并为全局大数组,通过偏移量转换索引,全程无Python循环,所有运算在NumPy底层C接口执行,百万级索引处理耗时可从秒级降到毫秒级。
实现代码:
import numpy as np # 计算每个子数组的行长度,生成对应起始行偏移量 sub_arr_lengths = np.array([len(arr) for arr in mainlist]) start_offsets = np.cumsum(np.insert(sub_arr_lengths, 0, 0))[:-1] # 所有子数组按行拼接为一个全局二维数组 global_arr = np.vstack(mainlist) # 转换为全局行索引后直接取值 global_row = start_offsets[index[:, 0]] + index[:, 1] result = global_arr[global_row]
方案2:Numba编译循环(内存受限场景适用)
如果子数组总容量超过内存无法拼接,可通过Numba JIT编译原有循环逻辑,无需修改业务逻辑即可获得近C语言级别的执行速度,内存开销和原有实现一致。
实现代码:
import numpy as np from numba import njit # 转换为元组适配Numba静态类型要求 main_tuple = tuple(mainlist) @njit # 开启JIT编译 def fast_indexing(main_tuple, index_arr): n = index_arr.shape[0] # 按实际数据维度初始化输出数组 out = np.zeros((n, main_tuple[0].shape[1]), dtype=np.float64) for i in range(n): arr_idx = index_arr[i, 0] row_idx = index_arr[i, 1] out[i] = main_tuple[arr_idx][row_idx] return out result = fast_indexing(main_tuple, index)
两种方案输出结果和原有循环实现完全一致,可直接替换使用。
内容的提问来源于stack exchange,提问作者datatech
相关产品推荐
相关产品推荐

