2016-06-07 86 views
5
之間的平方差

假設我有以下2個數組:總和2個numpy的陣列

import numpy as np 
a=np.asarray([[1,2,4], 
     [3,1,2]]) 
b=np.asarray([[2,1,1], 
     [3,2,3], 
     [4,1,2], 
     [2,2,1],]) 

對於在每一行a_row,我想獲得a_row,在b中的每一行之間的平方差的總和。結果數組將是2乘4陣列。預期的結果將是以下幾點:

array([[ 11., 5., 14., 10.], 
     [ 2., 2., 1., 3.]]) 

我的使用環路已經實現了一個解決方案:

c=np.zeros((2,4)) 
for e in range(a.shape[0]): 
    c[e,:] = np.sum(np.square(b-a[e,:]),axis=1) 
print c 

我需要的是一個全面的解決方案矢量,即不需要循環。

+0

似乎是一個自然的lambda表達式和封鎖。 – duffymo

回答

3

這裏是一個Numpythonic方法,簡單地通過重塑b,以便能夠直接從中減去a

>>> np.square(b[:,None] - a).sum(axis=2).T 
array([[11, 5, 14, 10], 
     [ 2, 2, 1, 3]]) 
+0

嗨Kasravand,謝謝你的回答。它適用於示例數組,但在實際腳本中出現內存錯誤。在我的腳本中,數組a的形狀是(500,3072),b的形狀是(5000,3072)。我想這可能是因爲這種方法是內存密集型的?我沒有使用我的問題中提到的循環方法得到錯誤。 – Allen

+0

@Allen我建議2種方法,起初如果你不處理大數字,你可以轉換你的數組[type](http://docs.scipy.org/doc/numpy-1.10.1/user/basics。 types.html)更簡單的類型如'int8',如果不可能的話,你可以將你的數組分割成更短的數組,然後單獨對它們進行操作,然後連接結果。這是一個很好的答案http://stackoverflow.com/questions/31268998/how-to-merge-two-large-numpy-arrays-if-slicing-doesnt-resolve-memory-error – Kasramvd

3

如果你有機會獲得SciPy的,那麼你可以做:

import scipy 
from scipy.spatial.distance import cdist 

import numpy as np 

a=np.asarray([[1,2,4], 
     [3,1,2]]) 
b=np.asarray([[2,1,1], 
     [3,2,3], 
     [4,1,2], 
     [2,2,1],]) 

x = cdist(a,b)**2 
# print x 
# array([[ 11., 5., 14., 10.], 
#  [ 2., 2., 1., 3.]]) 

它使用cdist功能,被矢量和快速。你可以使用numba或cython獲得更多的速度,但這取決於你的數組在實踐中的大小。

+0

謝謝喬希。我已經測試過,它工作正常。但是,在這種情況下,我需要一個完全矢量化的解決方案。即不能使用Scipy功能。 – Allen