2017-02-15 19 views
0

В настоящее время я пытаюсь нарисовать некоторые ребра в Networkx, мои узлы имеют 2 свойства патча, положение и статус, которые используются в алгоритм моделирования колонизации. Я пытался расширить свою симуляцию, что означает отказ от разработки эвклидовых расстояний между моими узлами (а также от кода, который работает!).В цикле - соответствие 'i' с индексом значения из csv (Python/Networkx)

У меня есть csv индекса числа строк ближайших соседей каждого узла, этот индекс соответствует строке другого csv, который имеет 3d-координаты содержащихся узлов. т.е. на ближайшем сосете csv в строке 0 могут иметь 3 ближайших соседа в одной и той же строке в отдельных столбцах, поэтому было бы 0, 56, 76, если бы узел 0 имел ближайших соседей в узле 56 и 76, который соответствовал бы строкам 0, 56 и 76 на координате csv.

Затем мне нужно нарисовать ребра между этими ближайшими соседними узлами, чтобы мой алгоритм играл с узлами. Так что у меня есть какой-то псевдо-код:

import networkx as nx 
import numpy as np 
from sklearn.neighbors import BallTree 
import csv 
from itertools import izip_longest 
import pandas as pd 

density = 0.14 #Stellar density per cubic parsec 
L = 100 

Patches = int(0.056*density*L**3+15) 
P_init = 0.0001 # Probability that a patch will be occupied at the beginning 
Distance = 10 

dat = np.random.uniform(low = -1, high = 1, size = (Patches,3)) * L 

np.savetxt('nearand1.csv', dat, delimiter = ',') 

nearand = np.genfromtxt('nearand1.csv', delimiter = ',',usecols=np.arange(0, 3)) 

tree = BallTree(nearand, leaf_size=2) 
ind = tree.query_radius(nearand, r=10) 
df = pd.DataFrame(ind) 
df.to_csv('bobbington4.csv',sep='e',index=False, header=False) 

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

bobbington = np.genfromtxt('bobbington4.csv', delimiter = ',', dtype = 'int') 
bobbington0 = bobbington[:,0] 
bobbington1 = bobbington[:,1] 
bobbington2 = bobbington[:,2] 
bobbington3 = bobbington[:,3] 
bobbington4 = bobbington[:,4] 
bobbington5 = bobbington[:,5] 
bobbington6 = bobbington[:,6] 
bobbington7 = bobbington[:,7] 
bobbington8 = bobbington[:,8] 
bobbington9 = bobbington[:,9] 
bobbington10 = bobbington[:,10] 
bobbington11 = bobbington[:,11] 
bobbington12 = bobbington[:,12] 
bobbington13 = bobbington[:,13] 


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

G = nx.Graph() 

for i in xrange(Patches): 

    Stat = 1 if np.random.uniform() < P_init else 0 
    Pos = (xcoord[i], ycoord[i], zcoord[i]) 
    G.add_node(patch(Stat,Pos)) 

for i in G.nodes(): 
    for j in G.nodes(): 
     if i.pos where i == bobbington0: 
      if j.pos where j == bobbington1: 
       G.add_edge(i,j) 

pos = {} 
for n in G.nodes(): 
    pos[n] = n.pos 


occup = [n.status for n in G] 

Time = [0] 
Occupancy = [np.sum([n.status for n in G])/float(Patches)] 

Здесь bobbington0 является только столбец индексов узлов происходит от 0 -> 7854 и bibbington1 является первым ближайшим соседом для каждого из этих узлов. Каков наилучший способ сделать это? Я изо всех сил пытаюсь найти что-либо по этой проблеме, но я, вероятно, плохо формулирую вещи. Заранее благодарим за любую помощь, которую вы можете мне дать.

+1

Я просто смотрел на некоторые из ваших предыдущих вопросов, и многие из них, в том числе и этот, будет в значительной степени выиграют от [Minimal, полный и Проверяемость] (http://stackoverflow.com/help/ mcve). Это облегчает нам помощь. –

+0

Я добавил в самый компактный код, который выполнит минимально необходимый. Спасибо за ваши советы, похоже, что их довольно много. Также это приведет только к краям для первых ближайших соседей, но как только первый будет работать, остальное будет следовать – Skippeh

+1

Вам не хватает импорта 'pandas' в вашем примере? (Я спрашиваю из-за 'pd.DataFrame'.) –

ответ

0

У меня это есть. Не особенно элегантный, но он работает.

for i in G.nodes(): 
    for j in G.nodes(): 
     diff1 = j.boba[0] - i.bubu 
     if diff1 == 0: 
      G.add_edge(i, j)