У меня есть список 300000 списков (волокнистые дорожки), где каждая дорожка представляет собой список (х, у, г) кортежи/координаты:Более эффективный способ подсчета пересечений?
tracks=
[[(1,2,3),(3,2,4),...]
[(4,2,1),(5,7,3),...]
...
]
У меня также есть группа масок, где каждая маска определяется как список (х, у, г) кортежей/координаты:
mask_coords_list=
[[(1,2,3),(8,13,4),...]
[(6,2,2),(5,7,3),...]
...
]
Я пытаюсь найти, для всех возможных пар масок:
- количество треков, которые пересекаются между собой маска-маска (создать соединение матрица ectivity)
- подмножество дорожек, которые пересекают каждую маску, чтобы добавить 1 к каждому (х, у, г) координаты для каждой дорожки в подмножестве (чтобы создать «плотность» изображение)
Я в настоящее время делает часть 1 следующим образом:
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
и часть 2, как так:
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
Использование наборов, чтобы найти перекрестки ускорило этот процесс, существенно, но обе части стил Я получаю более часа, когда у меня есть список из 70 или более масок. Есть ли более эффективный способ сделать это, чем повторять для каждого трека?
Все ответы кажутся незначительными улучшениями, но я думаю, что вам нужно больше, чем это. – McPherrinM
Если вы могли бы разместить образец данных и правильные ответы в пастебине, вы можете получить дополнительную помощь. –
Правильно ли я вижу, что пересечения определяются только как два координатных кортежа, одинаковые, а не как линии между пересекающимися координатами? – Svante