【问题标题】:Searching 1d array in 2d array in python在python中的二维数组中搜索一维数组
【发布时间】:2021-06-22 00:03:39
【问题描述】:

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

我想在big_DB 中找到一维数组(1, 6) 的索引。实际上,我一次要搜索 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 的结果,行中唯一,浮点数。

【问题讨论】:

  • 你有什么数据类型?
  • 这是我发的相关帖子:stackoverflow.com/q/64215263/2988730。搜索比排序更容易。一旦你澄清了一些事情就会发布。
  • big_DB 排序了吗?是真的吗?它会经常更新吗?您是否愿意改用映射类型?散列将比线性甚至二进制搜索快得多(400k 次迭代很重要)
  • big_DB 已排序,项目期间不会更新。
  • 它是什么数据类型?

标签: python arrays dataframe numpy indexing


【解决方案1】:

我能够让它工作的最快方法是使用 Python 的内置 dict 类型使用 O(1) 查找。您需要预处理您的数据库,这可能最多需要一两秒钟,但查找从我机器上的 >100ms 到

为了制作查找哈希表,我将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()]

【讨论】:

  • 'idx = dict_db[x.view(dt).item()]' 中的 x 是什么?
  • 这会引发“‘numpy.generic’对象的描述符‘item’不适用于‘numpy.ndarray’对象”
  • 在这种情况下,您需要提供完整的 MCVE。我对数组的外观做了假设,显然我错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多