2016-06-07 68 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