python - 在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 的结果,行中唯一,浮点数。
解决方案
我能够让它工作的最快方法是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()]
推荐阅读
- javascript - 如何使用正则表达式提取布尔运算符,后跟单词,直到下一个运算符?
- ignite - 将 DBeaver 连接到 Apache Ignite 数据库服务器时出现问题,握手失败
- h5py - 将多个不同大小的图像保存为 hdf5 (h5py) 的有效方法
- amazon-web-services - 如何在控制台上按数据点值对 Cloudwatch Metrics 进行排序?
- haskell - Haskell:制作一个包含 [0..9] 的所有组合的 6 位数列表
- php - 如何优化小写和大写格式扩展?
- google-cloud-platform - 如何在树莓派上运行使用 GCP 训练的 TFLITE 模型
- go-cobra - 使用 Cobra 更改为新标志名称时如何支持旧标志名称?
- python - 禁用 Django 的 ManyToManyField 的唯一约束
- android - Android Camera 2 API CaptureResult 与输出表面同步