首页 > 解决方案 > 在python中的二维数组中搜索一维数组

问题描述

假设我有一个巨大的 2D 数据库形状(1.2mil, 6)

我想(1, 6)big_DB. 实际上,我一次要搜索 64 个这些向量,形状为(64, 6).

这是我的代码:

for data in range(64): # I have 64 1d arrays to find
    self.idx = np.where((big_DB == arrays[data]).all(axis=1))

这需要 0.043 秒(对于所有 64 个阵列)。有没有更快的方法来做到这一点?我的项目将调用搜索功能超过 40,000 次。

编辑)big_DB 是 itertools.product 的结果,行中唯一,浮点数。

标签: pythonarraysdataframenumpyindexing

解决方案


我能够让它工作的最快方法是O(1)使用 Python 的内置dict类型进行查找。您需要预处理您的数据库,这可能最多需要一两秒钟,但查找从我机器上的 >100ms 到 <50us:对于所有 64 次查找,改进了 2000 倍或更好。由于我使用 100k 元素的数据库进行了测试,您可能会得到稍差的结果。您拥有的较大的数据库可能会导致更多的哈希冲突。

为了制作查找哈希表,我将每一行big_DB转换为字节对象。这构成了关键。然后值是每个元素的索引,因为这就是您想要进行查找的方式:

dt = f'V{big_DB.shape[1] * big_DB.dtype.itemsize}'
dict_db = dict(zip(map(np.void.item, np.squeeze(big_DB.view(dt))), range(len(big_DB))))

结果查找很简单

idx = dict_db[x.view(dt).item()]

推荐阅读