scipy.spatial.distance.

squareform#

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

將向量形式的距離向量轉換為方陣形式的距離矩陣,反之亦然。

參數:
Xarray_like

可以是精簡或冗餘的距離矩陣。

forcestr, optional

與 MATLAB(TM) 相同,如果 force 等於 'tovector''tomatrix',則輸入將分別被視為距離矩陣或距離向量。

checksbool, optional

如果設定為 False,則不會檢查矩陣對稱性或零對角線。如果已知 X - X.T1 很小且 diag(X) 接近於零,則此選項很有用。無論如何,這些值都會被忽略,因此它們不會擾亂 squareform 轉換。

返回:
Yndarray

如果傳遞的是精簡距離矩陣,則返回冗餘矩陣;如果傳遞的是冗餘矩陣,則返回精簡距離矩陣。

註解

  1. v = squareform(X)

    給定一個 n×n 的對稱距離矩陣 Xv = squareform(X) 返回一個大小為 n * (n-1) / 2(即二項式係數 n choose 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×n 的距離矩陣 XX[i, j]X[j, i] 的值設定為 \(v[{n \choose 2} - {n-i \choose 2} + (j-i-1)]\),並且所有對角線元素都為零。

在 SciPy 0.19.0 中,squareform 停止將所有輸入類型轉換為 float64,並開始返回與輸入相同 dtype 的陣列。

範例

>>> 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])