2013-05-10 71 views
2

說我有一個(3,3,3)這樣的數組。如何獲得numpy的3x3x3陣列上的歐幾里得距離

array([[[1, 1, 1], 
     [1, 1, 1], 
     [0, 0, 0]], 

     [[2, 2, 2], 
     [2, 2, 2], 
     [2, 2, 2]], 

     [[3, 3, 3], 
     [3, 3, 3], 
     [1, 1, 1]]]) 

我如何獲得對應歐氏距離9個值3個值的每個向量與零值之間?

如做numpy.linalg.norm([1,1,1] - [1,1,1]) 2次,然後做norm([0,0,0] - [0,0,0]),然後norm([2,2,2] - [1,1,1]) 2次,norm([2,2,2] - [0,0,0]),然後norm([3,3,3] - [1,1,1]) 2次,最後norm([1,1,1] - [0,0,0])

任何好的方法來這個矢量化?我想在(3,3,1)矩陣中存儲距離。

其結果將是:

array([[[0. ], 
     [0. ], 
     [0. ]], 

     [[1.73], 
     [1.73], 
     [3.46]] 

     [[3.46], 
     [3.46], 
     [1.73]]]) 
+0

是的,不幸的是,'norm'不允許'axis' arg。我不知道爲什麼。你可能會在這個[類似的問題]中找到你正在尋找的答案(http://stackoverflow.com/questions/7741878/how-to-apply-numpy-linalg-norm-to-each-row-of-a -matrix) – shx2 2013-05-10 04:17:11

回答

2

keepdims參數在numpy的1.7加入,你可以用它來保持和軸:

np.sum((x - [1, 1, 1])**2, axis=-1, keepdims=True)**0.5 

結果是:

[[[ 0.  ] 
    [ 0.  ] 
    [ 0.  ]] 

[[ 1.73205081] 
    [ 1.73205081] 
    [ 1.73205081]] 

[[ 3.46410162] 
    [ 3.46410162] 
    [ 0.  ]]] 

編輯

np.sum((x - x[0])**2, axis=-1, keepdims=True)**0.5 

結果是:

array([[[ 0.  ], 
     [ 0.  ], 
     [ 0.  ]], 

     [[ 1.73205081], 
     [ 1.73205081], 
     [ 3.46410162]], 

     [[ 3.46410162], 
     [ 3.46410162], 
     [ 1.73205081]]]) 
+0

感謝您的幫助。你可能離答案不遠了;我編輯的問題,以顯示我是多麼需要零值作爲編曲[0],而不僅僅是常用3 [0] [0]。 – chimpsarehungry 2013-05-10 13:33:53

+0

@chimpsarehungry,我編輯的答案,只需更換'[1,1,1]''到X [0]',你會得到的結果。 – HYRY 2013-05-10 22:00:38

1

你可能要考慮scipy.spatial.distance.cdist(),這有效地計算對點之間的距離在輸入兩個集合(與標準歐幾里德度量,等等)。下面是示例代碼:

import numpy as np 
import scipy.spatial.distance as dist 

i = np.array([[[1, 1, 1], 
       [1, 1, 1], 
       [0, 0, 0]], 
       [[2, 2, 2], 
       [2, 2, 2], 
       [2, 2, 2]], 
       [[3, 3, 3], 
       [3, 3, 3], 
       [1, 1, 1]]]) 
n,m,o = i.shape 

# compute euclidean distances of each vector to the origin 
# reshape input array to 2-D, as required by cdist 
# only keep diagonal, as cdist computes all pairwise distances 
# reshape result, adapting it to input array and required output 
d = dist.cdist(i.reshape(n*m,o),i[0]).reshape(n,m,o).diagonal(axis1=2).reshape(n,m,1) 

d認爲:

array([[[ 0.  ], 
     [ 0.  ], 
     [ 0.  ]], 

     [[ 1.73205081], 
     [ 1.73205081], 
     [ 3.46410162]], 

     [[ 3.46410162], 
     [ 3.46410162], 
     [ 1.73205081]]]) 

這種方法的最大需要注意的是,我們正在計算n*m*o距離,當我們只需要n*m(和它涉及的瘋狂量重塑)。

+0

fgb,我編輯了這個例子來幫助澄清。 – chimpsarehungry 2013-05-10 14:04:47

+0

@chimpsarehungry:我修改後的答案應該解決您的問題。 – fgb 2013-05-10 17:54:38

0

我正在做類似的工作,即計算視頻卷中每對幀的平方距離總和(SSD)。我認爲這可能對你有幫助。

video_volume是一個單一的4D numpy陣列。此數組的維數應爲 (時間,行,列,3)和dtype np.uint8。

輸出是dtype float的方形2d numpy數組。輸出[i,j]在幀i和j之間應該包含 SSD。

video_volume = video_volume.astype(float) 
size_t = video_volume.shape[0] 
output = np.zeros((size_t, size_t), dtype = np.float) 
for i in range(size_t): 
    for j in range(size_t): 
     output[i, j] = np.square(video_volume[i,:,:,:] - video_volume[j,:,:,:]).sum() 
+0

謝謝,我的視頻也是。如果可以的話,我想避免這樣的循環。 – chimpsarehungry 2013-05-10 13:44:28

相關問題