Ich habe eine Liste von 300000 Listen (Faserbahnen), wobei jede Spur eine Liste von (x, y, z) Tupeln/Koordinaten:Effizienter Weg, Kreuzungen zu zählen?
tracks=
[[(1,2,3),(3,2,4),...]
[(4,2,1),(5,7,3),...]
...
]
Ich habe auch eine Gruppe von Masken, wobei jede Maske definiert ist als eine Liste von (x, y, z) Tupeln/Koordinaten:
mask_coords_list=
[[(1,2,3),(8,13,4),...]
[(6,2,2),(5,7,3),...]
...
]
ich versuche, für alle möglichen Paare von Masken zu finden, die:
- die Anzahl von Spuren, die jeweils überschneiden Maske-Maske-Paar (um eine Verbindung zu erstellen ectivity matrix)
- die Teilmenge der Spuren, die jede Maske schneiden, um 1 zu jedem (x, y, z hinzuzufügen) in der Teilmenge für jede Spur Koordinate (ein „Dichte“ Bild zu erzeugen)
ich mache zur Zeit Teil 1 wie folgt:
def mask_connectivity_matrix(tracks,masks,masks_coords_list):
connect_mat=zeros((len(masks),len(masks)))
for track in tracks:
cur=[]
for count,mask_coords in enumerate(masks_coords_list):
if any(set(track) & set(mask_coords)):
cur.append(count)
for x,y in list(itertools.combinations(cur,2)):
connect_mat[x,y] += 1
und Teil 2 wie folgt:
def mask_tracks(tracks,masks,masks_coords_list):
vox_tracks_img=zeros((xdim,ydim,zdim,len(masks)))
for track in tracks:
for count,mask in enumerate(masks_coords_list):
if any(set(track) & set(mask)):
for x,y,z in track:
vox_tracks_img[x,y,z,count] += 1
Sets Mit Kreuzungen finden hat diesen Prozess beschleunigt signifikant, aber beiden Teile stil Ich brauche eine Stunde, wenn ich eine Liste von 70 oder mehr Masken habe. Gibt es dafür einen effizienteren Weg als für jeden Track zu iterieren?
Alle Antworten scheinen marginale Verbesserungen zu sein, aber ich denke, dass Sie mehr als das brauchen. – McPherrinM
Wenn Sie einen Beispieldatensatz und die richtigen Antworten in einem Pastebin irgendwo veröffentlichen könnten, erhalten Sie möglicherweise mehr Hilfe. –
Sehe ich das richtig, dass Schnittpunkte nur als zwei Koordinatentupel definiert sind, die gleich sind, und nicht als Linien zwischen den Schnittpunkten? – Svante