python - 快速搜索大型结构化 numpy 数组

标签 python arrays search numpy set

我有一个结构化的 numpy 格式数组

dataZero = [(1000, 1045),  # ('gid','lpid')
            (2345, 2500),
                 ...    ]

其中约有 130,000 个条目。我还有另一种格式的结构化数组

dataSnap = [(1002,...,...,...),   # ('gid',...)
            (2400,...,...,...),
            (2490,...,...,...),
                 ...          ]

但这包含 200 万个条目。

对于 dataZero 中的每个条目, i ,我想查找 dataSnap 中的条目满足条件dataZero['gid'][i] <= dataSnap['gid'] <= dataZero['lpid'][i] 。这应该允许返回多个条目。它可以返回满足此条件的条目的索引,也可以返回条目本身 - 只要我在合理的时间〜分钟内执行此操作。

在上面的示例中,这将返回,例如:

[some code] -> [[0],[1,2],...]   # if returning indices of dataSnap

[some code] -> [[(1002,...,...,...)],  # if returning the entries themselves
                [(2400,...,...,...),(2490,...,...,...)],
               ...]

我不知道如何快速做到这一点 - for 循环需要很长时间。可能会转换为一组{}会更好?任何建议/解决方案表示赞赏。

最佳答案

这是一个使用 Python 排序列表(而不是数组)的算法。您可能需要调整它才能与 numpy 一起使用。

def helper(dataZero, dataSnap): # assumes arguments are sorted ascending!
    ds_iter = iter(dataSnap)
    curr_snap = next(ds_iter)
    for lo, hi in dataZero:
        while curr_snap[0] < lo:
            curr_snap = next(ds_iter)
        while lo <= curr_snap[0] <= hi:
            yield curr_snap
            curr_snap = next(ds_iter) 

result = list(helper(dataZero, dataSnap))

我使用包含 200 万个随机生成条目的 dataSnap 和包含来自 dataSnap 的 130k 随机选择范围的 dataZero 对此进行了测试。在我的系统上最多花了几秒钟。

关于python - 快速搜索大型结构化 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25871161/

相关文章:

python - 从文件读取后如何修复数组中元素周围的 ' '

python - ImportError:无法从 'LatentDirichletAllocation' 导入名称 'sklearn.decomposition._online_lda'

objective-c - 重写 NSArray 文字以在 OS X 10.6 的 gcc 上编译

c - 错误地将 ASCII 输出为最接近的素数

Android ListView 搜索和快速滚动

algorithm - 下面算法的时间复杂度是多少

python - 生成和绘制梯度大小和方向的直方图

python - Django Haystack 在两个(多个)字段上自动完成

java - 当类构造函数有参数时,如何在java中初始化数组?

Linq To Sql Multiple Where 在 Foreach 循环中搜索