我开始知道numpy对于一个非常大的矩阵的单个元素访问很慢。下面这部分代码运行大约需要7-8分钟。矩阵的大小约为3000*3000
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个节点组成的图构建一个邻接矩阵。有人能帮我做这个愚蠢的方法吗?或者有其他选择吗?
编辑:这里是Distance()函数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坐标。
能否发布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. ]]