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

如何通过索引数组高效从含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:45:03