У меня есть проблема, в которой мы должны написать функцию, которая при вводе двоичного массива возвращает смещение в строках и столбцах соседнего индекса индекс самого низкого значения; один массив для смещения каждого индекса в строках и один массив для смещения в столбцах. Например, если самая низкая соседняя ячейка индекса находится на одной строке и правее одного столбца, смещение равно 1,1; если нижняя соседняя ячейка находится слева, смещение равно 0, -1; если это самая низкая ячейка из соседних ячеек, то смещение равно 0,0.Поиск наименьшего соседнего индекса в массиве Python
Поскольку я не мог найти более быстрый и правильный способ сделать это, я написал цикл while, который будет перебирать каждый индекс и видеть, какой из окружающих индексов для точки [i, j] был ниже, чем все другие окружающие индексы с использованием a.all():
def findLowNhbr(terrain):
"""Creates two 2D-arrays the shape of terrain consisting
of the offsets (row and column) to the neighbor with the minimum eleveation"""
rowOffset = np.zeros_like(terrain)
colOffset = np.zeros_like(terrain)
for i in range(len(terrain)):
if i == 0:
rowOffset[i] = 0
colOffset[i] = 0
elif i == (len(terrain)-1):
rowOffset[i] = 0
colOffset[i] = 0
else:
for j in range(len(terrain[i])):
if j == 0 or j == len(terrain[i])-1:
rowOffset[:,j] = 0
colOffset[:,j] = 0
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i-1,j-1]).all():
rowOffset[i,j] = -1
colOffset[i,j] = -1
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i,j-1]).all():
rowOffset[i,j] = 0
colOffset[i,j] = -1
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i+1,j-1]).all():
rowOffset[i,j] = 1
colOffset[i,j] = -1
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i-1,j]).all():
rowOffset[i,j] = -1
colOffset[i,j] = 0
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i+1,j]).all():
rowOffset[i,j] = 1
colOffset[i,j] = 0
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i-1,j+1]).all():
rowOffset[i,j] = -1
colOffset[i,j] = 1
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i,j]).all():
rowOffset[i,j] = 0
colOffset[i,j] = 1
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i+1,j+1]).all():
rowOffset[i,j] = 1
colOffset[i,j] = 1
else:
rowOffset[i,j] = 0
colOffset[i,j] = 0
return rowOffset, colOffset
Требуется много времени для запуска, но оно выполняется. Я не могу представить, что я на самом деле делаю это самым эффективным способом; любой вход?