scipy和numpy中的快速距离计算

2024-10-01 13:41:47 发布

您现在位置:Python中文网/ 问答频道 /正文

{{cdbe}数组

例如:

import numpy as np
from scipy.spatial.distance import cdist

A, B = np.random.rand(50,1000,10), np.random.rand(50,1000,10)

output = []
for day in range(50):
    output.append(cdist(A[day],B[day]))

我使用^{}。在

有没有更快的方法?理想情况下,我想为output得到一个((day,observation,observation))数组,它包含每天A和{}中观测值之间的成对距离,同时以某种方式避免数天的循环。在


Tags: fromimportnumpyoutputasnprandomscipy
2条回答

编辑:我是个白痴,忘了python的map是懒洋洋地计算的。我的“更快”代码实际上没有做任何工作!强制评估消除了性能提升。在

我认为你的时间将被scipy函数内的时间所支配。我将使用map而不是循环,因为我认为它更简洁一些,但我不认为有任何神奇的方法来获得巨大的性能提升。也许用cython或numba编译代码会有所帮助。在

一种方法(虽然需要大量内存)是巧妙地利用阵列广播:

output = np.sqrt( np.sum( (A[:,:,np.newaxis,:] - B[:,np.newaxis,:,:])**2, axis=-1) )

编辑

但是经过一些测试,似乎scikitlearn的^{}可能是大型数组的最佳选择。(请注意,我已将您的循环重写为列表理解。)

每天100个数据点:

^{pr2}$

这是每天2000个数据点:

In [5]: %timeit dists1 = np.asarray([cdist(x,y) for x, y in zip(A, B)])
1 loops, best of 3: 3.07 s per loop

In [7]: %timeit dists3 = np.asarray([euclidean_distances(x,y) for x, y in zip(A, B)])

1 loops, best of 3: 2.94 s per loop

相关问题 更多 >