В настоящее время я пытаюсь нарисовать некоторые ребра в 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 является первым ближайшим соседом для каждого из этих узлов. Каков наилучший способ сделать это? Я изо всех сил пытаюсь найти что-либо по этой проблеме, но я, вероятно, плохо формулирую вещи. Заранее благодарим за любую помощь, которую вы можете мне дать.
Я просто смотрел на некоторые из ваших предыдущих вопросов, и многие из них, в том числе и этот, будет в значительной степени выиграют от [Minimal, полный и Проверяемость] (http://stackoverflow.com/help/ mcve). Это облегчает нам помощь. –
Я добавил в самый компактный код, который выполнит минимально необходимый. Спасибо за ваши советы, похоже, что их довольно много. Также это приведет только к краям для первых ближайших соседей, но как только первый будет работать, остальное будет следовать – Skippeh
Вам не хватает импорта 'pandas' в вашем примере? (Я спрашиваю из-за 'pd.DataFrame'.) –