其他答案都没有完全回答这个问题-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解决方案进行基准测试)。