Как сделать проверку всех соседних элементов матрицы в питоне, с учетом крайних?
Я новичок в питоне и мне очень хочется разобраться. Передо мной такая задача: написать функцию, которая находит все экстремумы двумерной функции, а так же возвращает листы с координатами двумерных точек: 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 шт):
- А почему вас смущает единственность локального максимума и минимума? Ну сделайте вот так, например:
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]])
т.е. в вашем массиве - на той сетке, которую вы создали - действительно один глобальный минимум и один глобальный максимум.
- Про локальные минимумы-максимумы, вы что-то там перемудрили. Запишу только для максимумов - надеюсь для минимум с настройкой справитесь сами (ну и код, конечно требует оптимизации, но я его оставляю в таком виде, что-бы вы лучше его соотнесли со своим и поняли, в чем именно вы ошиблись):
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)]
Что, в общем-то вполне соответствует вашей функции, которая выглядит вот так: 
Обратите внимание, что выводимые индексы по координатам и значения по координатам - это разные вещи.