мое решение очень явное. Я уверен, что есть более элегантный способ обработки крайних случаев, но он может быть не таким читабельным. В идеале можно использовать numpy
для такой задачи. Это намного быстрее и предлагает лучшую индексацию и операции с массивами. Также вместо того, чтобы вводить idx
явно, можно использовать itertools
.
Я проверил код с помощью matplotlibs imshow
import random
r = 10
c = 15
M = []
for i in range(r):
M.append([])
for j in range(c):
M[i].append(random.random())
def find_max(M):
# Setup array dimensions and output array
r, c = len(M), len(M[0])
T = [[0 for col in range(c)] for row in range(r)]
# iterate over array
for i, row in enumerate(M):
for j, elem in enumerate(row):
# handle edge cases (literally!)
if i == 0:
if j==0:
idx = [(1,0), (1,1), (0,1)]
elif j==c-1:
idx = [(1,0), (1,-1), (0,-1)]
else:
idx = [(1,0), (1,1), (0,1), (1,-1), (0,-1)]
elif i==r-1:
if j==0:
idx = [(-1,0), (-1,1), (0,1)]
elif j==c-1:
idx = [(-1,0), (-1,-1), (0,-1)]
else:
idx = [(-1,0), (-1,1), (0,1), (-1,-1), (0,-1)]
else:
if j==0:
idx = [(-1,0), (-1,1), (0,1), (1,1), (1,0)]
elif j==c-1:
idx = [(-1,0), (-1,-1), (0,-1), (1,-1), (1,0)]
else:
idx = [(0,1), (1,1), (1,0), (1,-1), (0,-1), (-1,-1), (-1,0), (-1,1)]
# get the neighbors
neighbors = []
for x, y in idx:
neighbors.append(M[i + x][j + y])
# calculate t
if elem > max(neighbors):
T[i][j] = 1
return T
T = find_max(M)