From this thread's 您可以使用e_dist函数那里并且也获得相同的结果。
附录
定时:在我的记忆饿死的笔记本电脑,我只能做一个比较,以@Psidom的使用他norm_app功能比较小的样本。 7个运行的
一个= np.random.randint(0,9,(5000,3))
%timeit norm_app的(a) 1.91小号±每个环路13.5毫秒(平均±标准。dev的。 ,每个循环1圈)
%timeit e_dist(a,a) 631 ms±3.64 ms per loop(mean±std.dev。7点运行,1环的每个)的
a
array([[1, 2, 8],
[7, 4, 2],
[9, 1, 7],
[0, 1, 5],
[6, 4, 3]])
dm = e_dist(a, a) # get the def from the link
dm
Out[7]:
array([[ 0. , 8.72, 8.12, 3.32, 7.35],
[ 8.72, 0. , 6.16, 8.19, 1.41],
[ 8.12, 6.16, 0. , 9.22, 5.83],
[ 3.32, 8.19, 9.22, 0. , 7. ],
[ 7.35, 1.41, 5.83, 7. , 0. ]])
idx = np.argsort(dm)
closest = a[idx]
closest
Out[10]:
array([[[1, 2, 8],
[0, 1, 5],
[6, 4, 3],
[9, 1, 7],
[7, 4, 2]],
[[7, 4, 2],
[6, 4, 3],
[9, 1, 7],
[0, 1, 5],
[1, 2, 8]],
[[9, 1, 7],
[6, 4, 3],
[7, 4, 2],
[1, 2, 8],
[0, 1, 5]],
[[0, 1, 5],
[1, 2, 8],
[6, 4, 3],
[7, 4, 2],
[9, 1, 7]],
[[6, 4, 3],
[7, 4, 2],
[9, 1, 7],
[0, 1, 5],
[1, 2, 8]]])
感谢您的回答!它效果很好。还有一个问题。要找到点之间的最小距离,我将不得不消除每行的'0'并找到最小值。 但是,如果出现同一个点不止一次,那么我必须将它看作两个不同的点。所以,我必须减少a [i,i],因为它将为零,但我必须利用其他'0'。任何想法如何我可以实现这一目标? –
快速解决方法是用'np.nan'替换所有对角线,然后使用'np.nanmin'或'np.nanargmin':'dist = np.linalg.norm(a - a [:,None],axis = -1); dist [np.arange(dist.shape [0]),np.arange(dist.shape [0])] = np.nan; np.nanargmin(dist,axis = 0)' – Psidom