2013-04-17 98 views

回答

3

所有你需要的是

X - Y 

由於幾個人都提出,似乎試圖使形狀手動匹配的答案,我要解釋一下:
numpy的會自動展開Y的形狀,因此它與X相匹配。這被稱爲broadcasting,它通常在猜測應該做什麼方面做得非常好。在含糊的情況下,可以使用axis關鍵字來告訴它做哪些事情。這裏,因爲Y具有長度1的尺寸,所以這是擴展爲長度30以與X的形狀相匹配的軸。

例如,

In [87]: import numpy as np 

In [88]: n, m = 3, 5 

In [89]: x = np.arange(n*m).reshape(n,m) 

In [90]: y = np.arange(m)[None,...] 

In [91]: x.shape 
Out[91]: (3, 5) 

In [92]: y.shape 
Out[92]: (1, 5) 

In [93]: (x-y).shape 
Out[93]: (3, 5) 

In [106]: x 
Out[106]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14]]) 

In [107]: y 
Out[107]: array([[0, 1, 2, 3, 4]]) 

In [108]: x-y 
Out[108]: 
array([[ 0, 0, 0, 0, 0], 
     [ 5, 5, 5, 5, 5], 
     [10, 10, 10, 10, 10]]) 

但是,這是不是一個真正的歐氏距離,爲您的標題似乎在暗示你想要的:

df = np.asarray(x - y)    # the difference between the images 
dst = np.sqrt(np.sum(df**2, axis=1)) # their euclidean distances 
+0

我得到'ValueError異常:輸入必須是一個方形陣列 ' – user2229953

+1

@ user2229953哦,因爲你的'x'和'y'有型'matrix',使用'np.asarray'使平方會元 - 請參閱我的編輯。 – askewchan

+0

謝謝!但結果是有線的! 'dst [11368.09117391 7238.28732897 5975。85568237 6516.33956578 4690.22604361 4727.27377993 5210.6757694 4917.37040654 4315.19124481 4351.2316.13923247 4003.55476258 4175.54212706 4102.91009999 4330.4599796 4184.70386037 4134.89623796 4162.12512307 3828.49532333 3930.67847956 3766.93023507 3666.34224248 4040.05576148 3848.65880709 3845.35577393 3869.77351631 3836.28039808 3801.06876888 3799.32736535 3646.77473834]' – user2229953

1

使用array,爲了減去它使用numpy廣播from Y

init矩陣:

>>> from numpy import * 
>>> a = array([[1,2,3],[4,5,6]]) 

訪問第二排a

>>> a[1] 
array([4, 5, 6]) 

減去陣列從Y

>>> Y = array([3,9,0]) 
>>> a - Y 

array([[-2, -7, 3], 
     [ 1, -4, 6]]) 
+2

循環由[numpy broadcast]自動完成(http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html)。 – askewchan

+0

@askewchan謝謝,我更新了答案 – 0x90

0
a1 = numpy.array(X) #make sure you have a numpy array like [[1,2,3],[4,5,6],...] 
a2 = numpy.array(Y) #make sure you have a 1d numpy array like [1,2,3,...] 
a2 = [a2] * len(a1[0]) #make a2 as wide as a1 
a2 = numpy.array(zip(*a2)) #transpose it (a2 is now same shape as a1) 

print a1-a2 #idiomatic difference between a1 and a2 (or X and Y) 
+3

這個'a2 = [a2] * len(a1 [0])#make a2與a1'一樣寬是由[numpy broadcast]自動完成的(http://docs.scipy。組織/ DOC/numpy的/用戶/ basics.broadcasting.html)。 – askewchan

+0

謝謝:)我工作不夠努力:) –

+0

這是一個神奇的地方! – askewchan

1

從numpy的陣列只是想迭代行,可以真正地減去他們和numpy的意志用不同的方式創造新的陣列!

import numpy as np 
final_array = [] 
#X is a numpy array that is 30X8100 and Y is a numpy array that is 1X8100 
for row in X: 
    output = row - Y 
    final_array.append(output) 

輸出將是您所得X的陣列[0] - Y,X [1] - 等等Ÿ現在你final_array將與30個陣列內,每一個具有XY的值的數組你需要!就那麼簡單。只要確保你轉換你的矩陣先

編輯numpy的數組:由於numpy的廣播會做迭代,你需要的是一個線,一旦你有你的兩個數組:

final_array = X - Y 

然後這是你的陣列與差異!

+1

循環由[numpy broadcast]自動完成(http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html)。 – askewchan

+0

@askewchan哦,不知道......那簡直太簡單了,我做了編輯! –

相關問題