История вопроса связана с прошлым сообщением .Выбранный ответ обеспечивает хорошее решение.Однако есть еще один нюанс, который я хотел бы добавить.
Вместо использования массивов, указанных в сообщении , связанного с выше, эти массивы подчеркивают условие, что предыдущий набор решений обрабатывает не совсем так, как мне хотелось бы.Новые массивы:
import numpy as np
asp = np.array([2,1,8,2,5,4,6,4,3,3,3,3,2,1,8,2]).reshape((4,4)) #aspect
slp = np.array([11,11,12,11,12,11,12,10,9,9,9,10,11,10,11,11]).reshape((4,4)) #slope
elv = np.array([16,15,15,16,17,15,15,15,15,15,14,14,16,15,16,16]).reshape((4,4)) #elevation
Предыдущие решения присваивали уникальные номера зон везде, где высота, уклон и аспект были одинаковыми, независимо от того, были ли уникальные зоны пространственно смежными.Изображение ниже пытается показать этот результат (см. Верхнюю из 2 массивов в левом нижнем углу).Желаемый результат будет что-то вроде нижнего массива левого нижнего угла изображения.Например, обратите внимание, что каждая из угловых ячеек имеет одинаковую высоту, уклон и аспект, но не является пространственно смежной, и поэтому ей должны быть назначены собственные уникальные идентификаторы зоны.«Пространственно смежный» определяется как 2 (или более) соседних (смежных или диагональных) ячеек, которые имеют одинаковую высоту, наклон и аспект.Ячейки, выделенные красным цветом на изображении ниже, изображают это.
Среди предыдущих решений, не учитывающих пространственную непрерывность в результирующих зонах, наиболее значимым для меня было решение @Stephen Rauch.Его решение было (среди прочих):
combined = 10000 * asp + 100 * slp + elv
unique = dict(((v, i + 1) for i, v in enumerate(np.unique(combined))))
combined_unique = np.vectorize(unique.get)(combined)
![enter image description here](https://i.stack.imgur.com/EXKpb.png)