使用python中的networkx节点的N点python之间的快速3d距离

时间:2017-02-08 21:29:36

标签: python python-2.7 simulation networkx

我一直试图弄明白这一点,但我无法做到这一点。

我目前正在使用站点到站点渗透进行殖民模拟。我试图将其扩展到大数~10 ^ 6但是传统的numpy方法用于计算距离我是使用平方的比例尺,因此对于如此大的运行,程序运行超过一天。我真的希望这更快。我已经找到了解决方案,但我找不到任何可以帮助我的东西,因为我有一个用于模拟的自定义类。

所以我想要每个节点到所有其他节点的距离,如果节点在彼此的D_max范围内,则绘制边缘,允许两个节点之间的迁移。

`density = 0.14 #Stellar density per cubic parsec
 L = 100
Patches = int(0.056*density*L**3+15)
Distance = 5

nearand = np.genfromtxt('/Users/Skippy/nearand.csv', delimiter =    ',',usecols=np.arange(0, 3)).astype('float32') # a csv of 3d cartesian co-ordinates

G = nx.Graph()

xcoord = nearand[:,0]
ycoord = nearand[:,1]
zcoord = nearand[:,2]

class patch:
    def __init__(self,status=0,pos=(0,0,0)):
        self.status = status
        self.pos = pos
    def __str__(self):
        return(str(self.status))

for i in xrange(Patches):

    Stat = 1 if np.random.uniform() < P_init else 0 # a parameter used in the algorithm later
    Pos  = (xcoord[i], ycoord[i], zcoord[i])

    G.add_node(patch(Stat,Pos))

for p1 in G.nodes():
    for p2 in G.nodes():
        Dist = np.sqrt((p1.pos[2] - p2.pos[2])**2 + (p1.pos[1]-p2.pos[1])**2+(p1.pos[0]-p2.pos[0])**2)

        if Dist <= Distance:
            G.add_edge(p1,p2)`

在此之后,运行算法,但是在距离计算上保持较大的运行,因此只需要优化距离。有人可以帮我这个吗?它看起来与其他问题类似,但我需要能够像传统的numpy计算计算距离一样绘制这些边缘。

1 个答案:

答案 0 :(得分:0)

我所理解的一些评论。 您想创建一个“epsilon-neighborhood图”,计算从所有节点到彼此的距离,然后在距离低于阈值epsilon时进行过滤。

知道你的图是无向的,你只需要做(N x(N - 1))/ 2次计算。它仍然是二次O(n ^ 2),但是应该改变你创建边的循环,这样内循环总是从外循环索引+ 1开始。它会将计算减少一半。

现在,如果你想真正缩放,你应该思考是否可以使用近似最近邻法,因为你使用标准的L2范数(欧几里德距离)。

我建议你看看NMSLibAnnoy这样做。它们具有python绑定,但是为了速度而在C ++中实现。

希望它有所帮助。