2017-02-01 31 views
2

我想計算一個行矢量相對於矩陣中所有其他行矢量的距離總和。因此結果必須是方矩陣。如何將函數應用於矩陣中的所有矢量對

對於一個矩陣M

| a b c | | v1 | 
M = |  | = | | 
    | c d e | | v2 | 

我想計算:

| (a-a)+(b-b)+(c-c) (a-c)+(b-d)+(c-e) | | v1-v1 v1-v2 | 
M = |          | = |    | 
    | (c-a)+(d-b)+(e-c) (c-c)+(d-d)+(e-e) | | v2-v1 v2-v2 | 

我知道我可以在嵌套循環for做到這一點,但有一個更優雅的方式將這個或者其他任何類似的操作應用到一個有numpy的矩陣中?

回答

3

使用broadcasting -

(M[:,None,:]- M).sum(2) 

採樣運行 -

In [41]: M 
Out[41]: 
array([[8, 3, 2], 
     [6, 1, 2]]) 

In [42]: (M[:,None,:]- M).sum(2) 
Out[42]: 
array([[ 0, 4], 
     [-4, 0]]) 

如果M是NumPy的矩陣,得到一個數組視圖到它與np.asarray(),然後用它,就像這樣 -

M_arr = np.asarray(M) 
out = np.asmatrix((M_arr[:,None,:]- M_arr).sum(2)) 

樣品運行 -

In [69]: M = np.asmatrix(np.random.randint(0,9,(2,3))) 

In [70]: M 
Out[70]: 
matrix([[3, 8, 8], 
     [0, 5, 0]]) 

In [71]: M_arr = np.asarray(M) 

In [72]: np.asmatrix((M_arr[:,None,:]- M_arr).sum(2)) 
Out[72]: 
matrix([[ 0, 14], 
     [-14, 0]]) 

我們也驗證我們是否確實,以期在那裏工作與np.asarray() -

In [73]: np.may_share_memory(M, M_arr) 
Out[73]: True 
+0

感謝這個例子! :) – displayname

相關問題