Как сделать проверку всех соседних элементов матрицы в питоне, с учетом крайних?

Я новичок в питоне и мне очень хочется разобраться. Передо мной такая задача: написать функцию, которая находит все экстремумы двумерной функции, а так же возвращает листы с координатами двумерных точек: 4 листа - локальный и глобальный минимум и максимум. В моём коде я не могу найти ни одну точку локального минимума и максимума. А в листах с глобальными минимумами и максимумами только по одному значению. Понимаю, что у меня неправильно настроена индексация в сравнении элементов, но уже который день не могу разобраться самостоятельно. Подскажите мне, пожалуйста, правильное решение...

x = np.arange(-10, 10, 0.5)
y = np.arange(-10, 10, 0.5)

locMim = []
locMax = []
globMin = []
globMax = [] 


xgrid, ygrid = np.meshgrid(x, y)

zgrid = xgrid * xgrid * np.sin(ygrid)

for i in range(zgrid.shape[0]):
  for j in range(zgrid.shape[1]):
    if (zgrid[i,j] == zgrid.min()):
      globMin.append(zgrid.min())

    if (zgrid[i,j] == zgrid.max()):
      globMax.append(zgrid.max())

    if (zgrid[i,j] > 0 and zgrid[i,j] < len(zgrid)-1):
      if (zgrid[i,j] - 1 > zgrid[i,j] and zgrid[i,j] + 1 > zgrid[i,j] and zgrid[i,j] != zgrid.min()):
         locMim.append(zgrid[i,j])

      if (zgrid[i,j] - 1 < zgrid[i,j] and zgrid[i,j] + 1 < zgrid[i,j] and zgrid[i,j] != zgrid.max()):
         locMax.append(zgrid[i,j])

print(locMim)
print(locMax)
print(globMin)
print(globMax)

Ответы (1 шт):

Автор решения: passant
  1. А почему вас смущает единственность локального максимума и минимума? Ну сделайте вот так, например:
zgrid = xgrid * xgrid * np.sin(ygrid)
zgrid1 = zgrid.reshape(1,1600)
np.sort(zgrid1)

и получите

array([[-99.74949866, -98.93582466, -97.75301177, ...,  97.75301177,
         98.93582466,  99.74949866]])

т.е. в вашем массиве - на той сетке, которую вы создали - действительно один глобальный минимум и один глобальный максимум.

  1. Про локальные минимумы-максимумы, вы что-то там перемудрили. Запишу только для максимумов - надеюсь для минимум с настройкой справитесь сами (ну и код, конечно требует оптимизации, но я его оставляю в таком виде, что-бы вы лучше его соотнесли со своим и поняли, в чем именно вы ошиблись):
for i in range(zgrid.shape[0]):
    for j in range(zgrid.shape[1]):
        if (zgrid[i,j] == zgrid.min()):
            print(i,j,zgrid[i,j])
        if (i > 0 and j>0 and i<zgrid.shape[0]-1 and j<zgrid.shape[1]-1):
              if zgrid[i,j]>=max(zgrid[i-1,j-1],   
                                           zgrid[i-1,j],
                                           zgrid[i+1,j],
                                           zgrid[i,j-1], 
                                           zgrid[i,j+1]):
                 locMax.append((zgrid[i,j],i,j))

Смотрим Содержимое locMax

print (locMax)

[(-0.0, 3, 20), (-0.0, 4, 20), (-0.0, 5, 20), (-0.0, 6, 20), (-0.0, 7, 20), (-0.0, 15, 20), (-0.0, 16, 20), (-0.0, 17, 20), (-0.0, 18, 20), (-0.0, 19, 20), (0.0, 20, 20), (-0.0, 28, 20), (-0.0, 29, 20), (-0.0, 30, 20), (-0.0, 31, 20), (-0.0, 32, 20), (-0.0, 3, 20), (-0.0, 4, 20), (-0.0, 5, 20), (-0.0, 6, 20), (-0.0, 7, 20), (-0.0, 15, 20), (-0.0, 16, 20), (-0.0, 17, 20), (-0.0, 18, 20), (-0.0, 19, 20), (0.0, 20, 20), (-0.0, 28, 20), (-0.0, 29, 20), (-0.0, 30, 20), (-0.0, 31, 20), (-0.0, 32, 20)]

Что, в общем-то вполне соответствует вашей функции, которая выглядит вот так: введите сюда описание изображения

Обратите внимание, что выводимые индексы по координатам и значения по координатам - это разные вещи.

→ Ссылка