Python 数据集的最小距离

Python 数据集的最小距离,python,numpy,scikit-learn,distance,Python,Numpy,Scikit Learn,Distance,给我 from scipy.spatial.distance import cdist from sklearn.datasets import make_moons X, y = make_moons() cdist(X,X).min(axis=1) 这不是我想要的。我希望X中所有点之间的最小距离I不等于j。当然,如果i=j,那么我会得到0。如何使用cdist实现这一点?cdist计算数组的成对距离是一种过分的做法。对于数组,上三角形是所有可能距离的最小有意义表示,不包括到自身的0距离。方

给我

from scipy.spatial.distance import cdist
from sklearn.datasets import make_moons

X, y = make_moons()
cdist(X,X).min(axis=1)

这不是我想要的。我希望
X
中所有点之间的最小距离
I
不等于
j
。当然,如果
i=j
,那么我会得到
0
。如何使用
cdist
实现这一点?

cdist
计算数组的成对距离是一种过分的做法。对于数组,上三角形是所有可能距离的最小有意义表示,不包括到自身的0距离。方法是使用:

它返回一个上三角n阵列,即:

Y:Ndaray
返回一个压缩的距离矩阵Y。对于每个i和j(其中iYou基本上希望忽略距离矩阵的对角线,对吗?这可能不是最优雅的解决方案,但通过向对角线添加
inf
(或任何其他足够大的数字),
.min(axis=1)
应该可以工作。
(cdist(X,X)+np.diag([np.inf]*len(X)).min(轴=1)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
from scipy.spatial.distance import pdist
from sklearn.datasets import make_moons

X, y = make_moons()
# desired output
pdist(X).min()
%timeit pdist(X)
73 µs ± 825 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit cdist(X,X)
112 µs ± 315 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)