squareform
做這一切。閱讀文檔和實驗。它可以在兩個方向上工作。如果你給它一個矩陣,它將返回上面的三角形值(濃縮形式)。如果你給它的值,它返回矩陣。
In [668]: M
Out[668]:
array([[ 0. , 0.1, 0.5, 0.2],
[ 0.1, 0. , 2. , 0.3],
[ 0.5, 2. , 0. , 0.2],
[ 0.2, 0.3, 0.2, 0. ]])
In [669]: spatial.distance.squareform(M)
Out[669]: array([ 0.1, 0.5, 0.2, 2. , 0.3, 0.2])
In [670]: v=spatial.distance.squareform(M)
In [671]: v
Out[671]: array([ 0.1, 0.5, 0.2, 2. , 0.3, 0.2])
In [672]: spatial.distance.squareform(v)
Out[672]:
array([[ 0. , 0.1, 0.5, 0.2],
[ 0.1, 0. , 2. , 0.3],
[ 0.5, 2. , 0. , 0.2],
[ 0.2, 0.3, 0.2, 0. ]])
還可以指定一個force
和checks
參數,但如果沒有這些,它只是由形狀去。
Indicies可以來自triu
In [677]: np.triu_indices(4,1)
Out[677]:
(array([0, 0, 0, 1, 1, 2], dtype=int32),
array([1, 2, 3, 2, 3, 3], dtype=int32))
In [680]: np.vstack((np.triu_indices(4,1),v)).T
Out[680]:
array([[ 0. , 1. , 0.1],
[ 0. , 2. , 0.5],
[ 0. , 3. , 0.2],
[ 1. , 2. , 2. ],
[ 1. , 3. , 0.3],
[ 2. , 3. , 0.2]])
只是爲了檢查,我們可以在一個4x4矩陣填充這些值
In [686]: A=np.vstack((np.triu_indices(4,1),v)).T
In [687]: MM = np.zeros((4,4))
In [688]: MM[A[:,0].astype(int),A[:,1].astype(int)]=A[:,2]
In [689]: MM
Out[689]:
array([[ 0. , 0.1, 0.5, 0.2],
[ 0. , 0. , 2. , 0.3],
[ 0. , 0. , 0. , 0.2],
[ 0. , 0. , 0. , 0. ]])
那些triu
指數也可以從M
獲取值:
In [693]: I,J = np.triu_indices(4,1)
In [694]: M[I,J]
Out[694]: array([ 0.1, 0.5, 0.2, 2. , 0.3, 0.2])
squareform
使用spatial.distance._distance_wrap
中的編譯代碼,所以我預計它對於大型陣列來說會非常快。只有問題它只是返回壓縮的表單值,而不是索引。但考慮到形狀,指標總是可以計算的。他們不需要存儲值。
所有問題的答案都是肯定的。是的,這一切都有可能。開始工作。 – DyZ
哈哈我得到它的工作,但它很慢。我有一個大小爲76800 x 3900的矩陣。剛剛看到是否有更快的實現,但我認爲約翰有一個很好的建議去嘗試 –