Старайтесь избегать циклов for для увеличения Python кода - PullRequest
0 голосов
/ 31 марта 2020

Мне нужна помощь, чтобы повысить производительность.

Я получил заданный объем, который представляет собой 3d-матрицу из 0 и 1, представляющую воксели. Я также получил список очков. Для каждого вокселя в объеме я хотел бы знать расстояние до ближайшей точки, содержащейся в списке. Следующий код может занять очень много времени.

Result_Distances = np.zeros((10,10,10))
Volume = np.ones((10,10,10)) # or any other 3d matrix with 1s or 0s
ListofPoints = [(2,3,2), (2,3,3) ,(2,6,4),(9,6,8)] # or other points

for index, voxel in np.ndenumerate(Volume):

    if voxel == 1:    

            for index2 in ListofPoints:
                distance = np.sqrt((index[0]-index2[0])**2+(index[1]-index2[1])**2+(index[2]-index2[2])**2)
                distances.append(distance)

            Result_Distances[index] = np.amin(distances)

Это займет около 1 минуты для вычисления, потому что мой объем может быть очень большим (> 1000 вокселей). Мои ListofPoints меньше (около 100 баллов).

Есть ли умный способ избежать затрат времени на петли? Я также попробовал функцию map (), но не смог реализовать ее каким-либо образом, поэтому есть улучшение.

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...