向量中元素之间的最小距离

mneque 发布于 2019-03-09 numpy 最后更新 2019-03-09 14:37 4 浏览

我需要数组元素之间的最小距离。 我做了:

numpy.min(numpy.ediff1d(numpy.sort(x)))
有没有更好/更高效/更优雅/更快捷的方式?
已邀请:

wfuga

赞同来自:

try:
    min(x[i+1]-x[i] for i in xrange(0, len(x)-1))
except ValueError:
    print 'Array contains less than two values.'

dut

赞同来自:

如果你的速度很快,这里有一些时间:

In [13]: a = np.random.rand(1000)
In [14]: %timeit np.sort(a)
10000 loops, best of 3: 31.9 us per loop
In [15]: %timeit np.ediff1d(a)
100000 loops, best of 3: 15.2 us per loop
In [16]: %timeit np.diff(a)
100000 loops, best of 3: 7.76 us per loop
In [17]: %timeit np.min(a)
100000 loops, best of 3: 3.19 us per loop
In [18]: %timeit np.unique(a)
10000 loops, best of 3: 53.8 us per loop
unique的时间期望它与sort的速度相当快,如果唯一数组的长度比数组本身短,那么你可以在没有调用diffmin的情况下提前爆发(因为这意味着你的回答是0)。但unique的开销超过任何增益。 因此,我可以提供的唯一潜在改进是用diff替换ediff1d
In [19]: %timeit np.min(np.diff(np.sort(a)))
10000 loops, best of 3: 47.7 us per loop
In [20]: %timeit np.min(np.ediff1d(np.sort(a)))
10000 loops, best of 3: 57.1 us per loop

out

赞同来自:

您当前的方法绝对是最佳的。通过先排序,您将减少每个元素之间的空间,ediff1d将返回差异数组。这是一个建议: 由于我们知道差异必须是正数,因为我们有一个升序排序,我们可以手动实现ediff1d并包含差值为零的中断。这样,如果您有已排序的数组x[1, 1, 2, 3, 4, 5, 6, 7, ... , n] 您的ediff1d函数不会遍历n个元素,而是提前中断并仅覆盖前两个元素,返回[0]。这也减少了差异数组的大小,减少了min调用所需的迭代次数。 这是一个不使用numpy的例子:

x = [1, 12, 3, 8, 4, 1, 4, 9, 1, 29, 210, 313, 12]
def ediff1d_custom(x):
    darr = []
for i in xrange(len(x)):
        if i != len(x) - 1:
            diff = x[i + 1] - x[i]
            darr.append(diff)
if diff == 0:
                break
return darr
print min(ediff1d_custom(sorted(x))) # prints 0