Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在固定长度的六角体列表中查找最小汉明距离的最快方法_Python_Hamming Distance - Fatal编程技术网

Python 在固定长度的六角体列表中查找最小汉明距离的最快方法

Python 在固定长度的六角体列表中查找最小汉明距离的最快方法,python,hamming-distance,Python,Hamming Distance,我正在用Python生成大约30000个图像的48位十六进制散列,并将其存储在一个字典列表中(phashes以及一些其他图像属性)。例如: [{"name":"name1", "phash":"a12a5e81127d890a7c91897edc752b506657233f56c594b7e6575e24e457d465"}, {"name":"name2", "phash":"a1aa7e011367812a7c9181be9975a9e86657239f3ec09697e6565a24e5

我正在用Python生成大约30000个图像的48位十六进制散列,并将其存储在一个字典列表中(phashes以及一些其他图像属性)。例如:

[{"name":"name1", "phash":"a12a5e81127d890a7c91897edc752b506657233f56c594b7e6575e24e457d465"},
 {"name":"name2", "phash":"a1aa7e011367812a7c9181be9975a9e86657239f3ec09697e6565a24e50bf477"}
 ...
 {"name":"name30000", "phash":"a1aa7e05136f810afc9181ba9951a9686617239f3ec4d497e6765a04e52bfc77"}]

然后,我从一个树莓Pi获得了视频输入,该Pi是分阶段的,该散列将与该数据库进行比较(鉴于Pi摄像机的性质,来自视频流的测试散列将永远不会与数据库中的散列相匹配)。现在我正在做一个哑巴循环,循环大约需要5秒钟来检查~30000个预先计算的散列中每个散列的汉明距离,这太慢了。我使用的Imagehash库意味着可以通过执行
dbHash1-testHash
简单地计算汉明距离。显然,排序和对分不是实现这一点的方法,因为排序与汉明距离无关。所以,我想一定有更快的方法来完成这件事?我读过有关度量空间的文章,但我想检查是否有人知道(相对)简单的Python实现。

支持汉明距离。我想试试。

我从ImageHash后面的人那里得到了答案

我可以将数据库存储为2d矩阵:

arr = []
for dbHash in db:
    arr.append(dbHash.hash.flatten())
arr = numpy.array(arr)
然后我可以同时与所有人进行比较:

binarydiff = arr != testhash.hash.reshape((1,-1))
hammingdiff = binarydiff.sum(axis=1)
closestdbHash_i = numpy.argmin(hammingdiff)
closestdbHash = db[closestdbHash_i]

啊,我会在OP里说清楚,;我要查找的测试哈希肯定与任何数据库哈希都不匹配。我正在寻找汉明距离最小的一个。有很多数据结构支持搜索度量空间,请看这个问题:我见过这个,但我不知道如何实现这些,一旦实现,我已经知道如何从我的测试散列和数据库中的所有散列中获得汉明距离。我需要的是一种不涉及30000循环迭代的快速方法。Scipy的实现是用C++编写的,并且可能是相当优化的。虽然仍然依赖于运行直接成对比较,但它应该比我们编写的一次性比较快得多。不过,我应该把这个注释作为一个评论发布,因为它并没有回答您关于度量空间的主要问题。