2013-04-05 114 views
1

我开始知道numpy对于一个非常大的矩阵来说是单个元素访问缓慢的。代码的以下部分需要大约7-8分钟才能运行。矩阵的大小大约是3000 * 3000numpy 2D矩阵 - 在这种情况下如何提高性能?

import numpy as np 
................ 
................ 
ArrayLength=len(Coordinates) 
AdjMatrix=np.zeros((len(Angles),len(Angles))) 
for x in range(0, Arraylength): 
    for y in range(x+1, Arraylength-x): 
     distance=Distance(Coordinates[x],Coordinates[y) 
      if(distance<=radius) 
       AdjMatrix[x][y]=distance 
       AdjMatrix[y][x]=distance 

我基本上是试图构建一个邻接矩阵为一个由约3000节点的图。有人可以帮助我做这种颠簸的方式吗?或者任何替代品?

编辑:这里是距离()函数

Def Distance(p1,p2): 
    distance=np.sqrt(np.square(p1[0]-p2[0])+np.square(p1[1]-p2[1])) 
    return distance 

通过我传递坐标元组的方式。作为在P [0] = x坐标和P [1] = y坐标。

回答

3

你能发布Distance()函数吗?如果它是常见的功能,scipy.spatial.distance.cdist可以非常快速地计算距离矩阵:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html#scipy.spatial.distance.cdist

编辑

您可以使用pdist的确,这里有一个例子:

from scipy.spatial.distance import pdist, squareform 
coordinates = [(0.0, 0), (1.0, 2.0), (-1.0, 0.5), (3.1, 2.1)] 
dist = squareform(pdist(coordinates)) 
print dist 

输出:

[[ 0.   2.23606798 1.11803399 3.74432905] 
[ 2.23606798 0.   2.5   2.1023796 ] 
[ 1.11803399 2.5   0.   4.40113622] 
[ 3.74432905 2.1023796 4.40113622 0.  ]] 

如果你想掩盖一些数据:

dist[dist > 3.0] = 0 
print dist 

输出:

[[ 0.   2.23606798 1.11803399 0.  ] 
[ 2.23606798 0.   2.5   2.1023796 ] 
[ 1.11803399 2.5   0.   0.  ] 
[ 0.   2.1023796 0.   0.  ]] 
+1

你可以用'AdjMatrix [AdjMatrix> =半径] = 0'结合这重复上面的代码,没有Python循环。 – mtrw 2013-04-05 11:01:12

+0

我已编辑我的问题。请看看。 @mtrw请你详细说明一下吗?我很抱歉..我不太熟悉python – 2013-04-05 11:22:07