2012-12-10 56 views
4

行我最近发现的scipy.spatial.distance.cdist命令是用于求解源和目的双载体的阵列之间的距离COMPLETE矩阵非常快。 看到:How can the euclidean distance be calculated with numpy? 我想尝试解决两个相同大小的阵列之间的距离时复制这些性能提升。两个SINGLE向量之间的距离是非常直接的计算,如前面的链接所示。我们可以把向量:最快的方法来计算2台使用numpy的或SciPy的向量之间的欧几里得距离

import numpy as np 
    A=np.random.normal(size=(3)) 
    B=np.random.normal(size=(3)) 

然后用'numpy.linalg.norm'其中

np.linalg.norm(A-B) 

相当于

temp = A-B 
    np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2) 

时,我想知道这可是很好地工作两组向量之间的距离,其中第二个解决方案完美地工作。在按预期:

A=np.random.normal(size=(3,42)) 
    B=np.random.normal(size=(3,42))  
    temp = A-B 
    np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2) 

给我一个组的Ai的第元件42米之间的距离向的Bi th元素。而norm函数正确地计算整个矩阵的标准,给我一个不是我正在寻找的值。 与42米距离的行为是我要保持,希望用几乎一样的速度,因为我从cdist得到解决完整矩阵什么。所以问题是什么是最有效的方式使用python和numpy/scipy来计算i数据与形状(n,i)之间的距离?

感谢, 斯隆

回答

3

我想你已经破解最自己的情况。而不是你的最后一行,但是,我会用:

np.sqrt(np.sum(temp**2,0)) 
+0

谢谢,我会配置文件,看看有多少蚊帐我的增益的,我真的很希望,有使用C的一种方式图书馆虽然进一步表现。 – SoulNibbler

+1

奇怪的是,对于100万个元素,其实际使用np.sqrt(temp [0] ** 2 + temp [1] ** 2 + temp [2] ** 2)的速度要快3倍。 – SoulNibbler

+0

这确实是一个意想不到的(并令人担忧的)结果......!蛇以神秘的方式工作...... ;-)。我对这是为什么很感兴趣,所以你想在这个问题上发表一个新的问题,还是我? –

0

这里有两种方法我觉得定时比较是最合适的:

import timeit 
In[19]: timeit.timeit(stmt='np.linalg.norm(x-y,axis=0)', setup='import numpy as np; x,y = np.random.normal(size=(10, 100)), np.random.normal(size=(10, 100))', number=1000000) 
Out[19]: 15.132534857024439 

In[20]: timeit.timeit(stmt='np.sqrt(np.sum((x-y),axis=1))', setup='import numpy as np; x,y = np.random.normal(size=(10, 100)), np.random.normal(size=(10, 100))', number=1000000) 
Out[20]: 9.417887529009022 

我并不感到惊讶的numpy的方法作品更快。我相信随着python的不断改进,这些内置函数将会得到改进。

测试在蟒蛇Python版本3.5.2进行

相关问题