当前位置: 首页 > 面试题库 >

Python中最快的成对距离度量

郑锋
2023-03-14
问题内容

我有一个一维数字数组,想计算所有成对的欧几里得距离。我有一种方法(感谢SO)在广播中执行此操作,但是它效率低下,因为它两次计算每个距离。而且它的伸缩性不好。

这是一个示例,它为我提供了1000个数字的数组。

import numpy as np
import random
r = np.array([random.randrange(1, 1000) for _ in range(0, 1000)])
dists = np.abs(r - r[:, None])

我可以使用scipy / numpy / scikit-learn中最快的实现来执行此操作,因为它必须扩展到一维数组具有> 10k值的情况。

注意:矩阵是对称的,所以我猜想通过解决这个问题至少可以使速度提高2倍,我只是不知道该怎么做。


问题答案:

其他答案都没有完全回答这个问题-1个在Cython,一个比较慢。但是两者都提供了非常有用的提示。跟进他们的建议表明这scipy.spatial.distance.pdist是要走的路。

这是一些代码:

import numpy as np
import random
import sklearn.metrics.pairwise
import scipy.spatial.distance

r = np.array([random.randrange(1, 1000) for _ in range(0, 1000)])
c = r[:, None]

def option1(r):
    dists = np.abs(r - r[:, None])

def option2(r):
    dists = scipy.spatial.distance.pdist(r, 'cityblock')

def option3(r):
    dists = sklearn.metrics.pairwise.manhattan_distances(r)

使用IPython计时:

In [36]: timeit option1(r)
100 loops, best of 3: 5.31 ms per loop

In [37]: timeit option2(c)
1000 loops, best of 3: 1.84 ms per loop

In [38]: timeit option3(c)
100 loops, best of 3: 11.5 ms per loop

我没有尝试过Cython实现(我不能在该项目中使用它),但是将我的结果与所做的其他答案进行比较,似乎scipy.spatial.distance.pdist比Cython实现慢了大约三分之一(考虑到不同的机器)通过对np.abs解决方案进行基准测试)。



 类似资料:
  • 注意:矩阵是对称的,所以我猜测,通过寻址它,至少有可能获得2倍的加速,我只是不知道如何实现。

  • 问题内容: 目前,我在mysql数据库中的位置不足一百万,所有位置都包含经度和纬度信息。 我试图通过查询找到一个点和许多其他点之间的距离。它并没有我想要的那么快,尤其是每秒100次以上的命中。 是否有更快的查询,或者可能是比mysql更快的系统?我正在使用此查询: 注意:提供的距离以 英里为单位 。如果您需要 公里 ,请使用代替。 问题答案: 使用表中数据类型的值创建点。从Mysql 5.7.5开

  • 问题内容: 在Python + Sqlite中是否有可用的字符串相似性度量,例如与模块有关? 用例示例: 此查询应匹配ID为1的行,但不匹配ID为2的行: 如何在Sqlite + Python中做到这一点? 关于我到目前为止发现的注释: 该Levenshtein距离,即单字符编辑(插入,删除或替换)的最小数量需要改变一个字到另一个,可能是有用的,但我不知道是否SQLite中存在的正式实施(我看到一

  • 例如,我有两个实体列表和一个测量它们之间距离的函数。假设是姓名和电子邮件。在下面的表格中,我测量了每封电子邮件到每个名字的距离。 现在我想在名称中找到每个电子邮件的最小距离对。但是,请注意,如果两封电子邮件具有相同的最小距离名称候选人,则赢得距离最小的人。在这种情况下,另一个电子邮件应该选择第二接近的候选名称,并再次检查。 因此,在这种情况下,结果应为: 解释表: 速度很重要。。它可以以数据帧或d

  • 我正在学习CLR中的一节,它描述了使用分而治之的方法,使用两点之间的欧几里德距离来找到最近的点对。 有一个问题,要求找到最近的点对之间的manhatten距离,使用类似的方法。但是,我不能把握两者之间的区别。以下是我能想到的: 3)递归到我们的点子集<=3为止(在这种情况下使用蛮力) 4)最小距离可以是从任何一个递归调用返回的距离--称它为D。 5)找到线“L”周围2D宽度内所有点,然后对于每个这

  • 我有一个多边形类型的几何体,我正在计算一个点的最小距离可能在多边形几何体内部(由360个点组成,作为闭合几何体)或多边形几何体外部。使用postgis的ST_distance方法,当点在几何体外部时,我得到精确的距离,但如果点在几何体内部,则得到0作为距离,我想要与多边形几何体最近点的点之间的最小距离,无论该点位于几何体内部还是外部。