Два ненулевых элемента в массиве 3D numpy "связаны"? - PullRequest
1 голос
/ 04 мая 2020

При просмотре массива 3D numpy, представляющего трехмерное пространство, два индекса массива A и B «связаны», если существует путь от A до B, где Path - это список индексов массива, где каждая соседняя пара элементов Path [i] и Path [i + 1] являются (1) индексами ненулевых элементов во входном массиве и (2) «рядом» друг с другом, np.max (np.abs (Path [i] - Path) [i + 1])) <= 1. </p>

Учитывая начальный индекс A, я хотел бы сгенерировать список A_Connected, который является списком всех индексов массива, которые «связаны» с A.

Мой медленный метод будет:

def find_connected_list(array, index, connected_list):
   connected_list.append(index)

   for x in range(index[0]-1, index[0]+2):
      for y in range(index[1]-1, index[1]+2):
         for z in range(index[2]-1, index[2]+2):
            if x>= 0 and x < array.shape[0] and y >= 0 and y < array.shape[1] and z >= 0 and z < array.shape[2] and array[x,y,z] > 0 and not [x,y,z] in connected_list:
               connected_list = find_connected_list(array, [x,y,z], connected_list)

   return connected_list

1 Ответ

1 голос
/ 10 мая 2020

Вам нужно взглянуть на проблему под совершенно другим углом. Это графическая задача, для которой вам нужна матрица переходов.

  • для каждого элемента вашего массива вы должны определить его непосредственных подключенных соседей

  • результат этого должен быть сохранен в 2d массиве NxN где N - общее количество элементов в вашем трехмерном массиве, это матрица перехода T

  • , тогда вашей отправной точкой будет вектор V длины N с N-1 нулями и одним 1

  • вычислите T ^ k V и увеличьте T, чтобы найти все соединенные точки, которые находятся в k шагах от V

Это только руководство, Вы найдете подробности здесь .

Python Кодирование не очень сложно. Вы можете использовать тот факт, что T симметрична c с 1 по диагонали, чтобы ускорить процесс.

Надеюсь, что это поможет.

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