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