2017-08-09 43 views
2

我有一個熊貓數據框,其中包含兩列(Word和Word_Position)。我需要找出單詞之間的距離並以矩陣形式呈現輸出以提高可讀性。如何找到Python中兩個矩陣之間的差異,結果不應該有減號的任何值

我到目前爲止所做的工作是從DF.Word_Position列創建了一個行矩陣,並將其轉置爲創建列矩陣。當我減去這兩個矩陣時,我在它們之前得到了帶有負號的少數值。

與所有尊重偉大的數學,這絕對是正確的,但對我的要求,我只需要數量,而不是減號。

有沒有其他更好的方法來做同樣的事情?感謝您的幫助。提前致謝。

注:我使用Python 3.6

代碼段和其相應的輸出,供大家參考

m1 = np.matrix(df1['Word Position']) 
print(m1) 
[[ 1 2 3 ..., 19 20 21]] 

m2 = np.matrix(m1.T) 
print(m2) 
[[ 1] 
[ 2] 
[ 3] 
..., 
[19] 
[20] 
[21]] 

print(m2-m1) 
[[ 0 -1 -2 ..., -18 -19 -20] 
[ 1 0 -1 ..., -17 -18 -19] 
[ 2 1 0 ..., -16 -17 -18] 
..., 
[ 18 17 16 ..., 0 -1 -2] 
[ 19 18 17 ..., 1 0 -1] 
[ 20 19 18 ..., 2 1 0]] 
+0

我可以知道爲什麼這個問題是downvoted的原因嗎? – JKC

回答

2

只取絕對值?

np.abs(m2 - m1) 

你的代碼表明你的數據由numpy數組組成,所以上面的解決方案應該可以工作。

如果他們dataframes,你可以這樣做:

m2.sub(m1).abs() 
+0

謝謝@亞歷山大。這看起來很簡單,對我這樣的python新手很有幫助 – JKC

1

如果你想陣列之間的距離,正確的方法是計算norm

dists = [np.linalg.norm(m - m2, axis=1) for m in m1[0]] 

此假設陣列的該形狀是(n_sample, n_dimension)

不是List理解的,你可以做numpy的廣播上平方米


我你想你可能想使用scipy.spatial.distance.cdist度量更多的控制。對於大型陣列,此選項更快。與閔可夫斯基距離(p = 2時爲歐幾里得距離)的示例:

dists = [scipy.spatial.distance.cdist(m, m2, 'minkowski', p) for m in m1] 

當然,如果陣列是唯一1D可以實現,使用絕對值:

dists = np.abs(m1 - m2) 
+0

謝謝@ Y0da。如果我沒有錯,np.linalg.norm(m1-m2)或np.linalg.norm(m2-m1)只會產生單個值。但我需要的是矩陣形式的輸出,其中每個單詞和每個單詞之間的距離爲值 – JKC

+0

@JKC嘗試使用軸選項:axis = 1或axis = 0 – Y0da

+0

對不起@Y0da即使使用軸選項我不是獲得所需的輸出。可能這是不適用於我的要求,我感覺。亞歷山大的迴應非常有用和簡單。 – JKC

1

在這種情況下,你可能想使用scipy.spatial.distance.pdist

from scipy.spatial.distance import squareform, pdist 
m = df1['Word Position'].data[:, None] 
dist = squareform(pdist(m, 'minkowksi', 1)) 

這有點大材小用,但可擴展的如果你想改變你的距離參數,並且通常比廣播更快(因爲它只做一半的減法步驟abs(a-b) == abs(b-a))。如果你想做廣播,你可以這樣做:

dist = np.abs(m - m.T) 
+0

我認爲你的答案需要一個二維數組作爲輸入。但我的要求涉及兩個1D陣列。 – JKC

+0

輕鬆修復。請參閱編輯。 –

+0

是的。 abs選項正如其他受訪者早些時候所建議的那樣工作 – JKC

相關問題