scipy.spatial.distance.

squareform#

scipy.spatial.distance.squareform(X, force='no', checks=True)[source]#

将向量形式的距离向量转换为方阵形式的距离矩阵,反之亦然。

参数:
Xarray_like

压缩形式或冗余形式的距离矩阵。

forcestr, 可选

与 MATLAB(TM) 一样,如果 force 等于 'tovector''tomatrix',则输入将分别被视为距离矩阵或距离向量。

checksbool, 可选

如果设置为 False,则不会检查矩阵的对称性或对角线是否为零。如果您确定 X - X.T 很小且 diag(X) 接近于零,则此功能很有用。这些值无论如何都会被忽略,因此它们不会干扰 squareform 转换。

返回:
Yndarray

如果传入的是压缩距离矩阵,则返回冗余矩阵;如果传入的是冗余矩阵,则返回压缩距离矩阵。

附注

  1. v = squareform(X)

    给定一个 n-by-n 对称距离方阵 Xv = squareform(X) 返回一个大小为 n * (n-1) / 2(即二项式系数 n 选 2)的向量 v,其中 \(v[{n \choose 2} - {n-i \choose 2} + (j-i-1)]\) 是不同点 ij 之间的距离。如果 X 不是方阵或不对称,则会引发错误。

  2. X = squareform(v)

    给定一个大小为 n * (n-1) / 2 的向量 v(其中 n >= 1),按照上述方式编码距离,X = squareform(v) 返回一个 n-by-n 的距离矩阵 XX[i, j]X[j, i] 的值被设置为 \(v[{n \choose 2} - {n-i \choose 2} + (j-i-1)]\),所有对角元素均为零。

在 SciPy 0.19.0 中,squareform 不再将所有输入类型转换为 float64,并开始返回与输入数据类型相同的数组。

示例

>>> import numpy as np
>>> from scipy.spatial.distance import pdist, squareform

x 是三维空间中五个点的数组。

>>> x = np.array([[2, 0, 2], [2, 2, 3], [-2, 4, 5], [0, 1, 9], [2, 2, 4]])

pdist(x) 计算 x 中每对点之间的欧几里得距离。距离以长度为 5*(5 - 1)/2 = 10 的一维数组形式返回。

>>> distvec = pdist(x)
>>> distvec
array([2.23606798, 6.40312424, 7.34846923, 2.82842712, 4.89897949,
       6.40312424, 1.        , 5.38516481, 4.58257569, 5.47722558])

squareform(distvec) 返回 5x5 的距离矩阵。

>>> m = squareform(distvec)
>>> m
array([[0.        , 2.23606798, 6.40312424, 7.34846923, 2.82842712],
       [2.23606798, 0.        , 4.89897949, 6.40312424, 1.        ],
       [6.40312424, 4.89897949, 0.        , 5.38516481, 4.58257569],
       [7.34846923, 6.40312424, 5.38516481, 0.        , 5.47722558],
       [2.82842712, 1.        , 4.58257569, 5.47722558, 0.        ]])

当给定距离方阵 m 时,squareform(m) 返回与该矩阵相关联的一维压缩距离向量。在这种情况下,我们恢复了 distvec

>>> squareform(m)
array([2.23606798, 6.40312424, 7.34846923, 2.82842712, 4.89897949,
       6.40312424, 1.        , 5.38516481, 4.58257569, 5.47722558])