2014-05-07 3 views
3

У меня есть массив (960,960), и я пытаюсь найти критические точки, чтобы найти локальные экстремумы.Как найти критические точки 2D-массива в python?

Я пробовал использовать np.diff и np.gradient, но я столкнулся с некоторыми проблемами, и я не уверен, какую функцию использовать.

np.diff предлагает возможность вычисления дифференциала второго порядка, но градиент этого не делает.

Как мне получить критические точки?

Я попытался

diff = np.diff(storm, n=2)      

dxx = diff[0]                                 
dyy = diff[1]                                 

derivative = dyy/dxx 

Я бегу в проблемы здесь, потому что некоторые из значений вдоль Dxx равны нулю.

Тогда есть возможность

gradient = np.gradient(storm) 
g2 = np.gradient(gradient) 

, но это даст мне то, что я ищу?

ответ

3

Критическая точка - это точка, где первая производная (или градиент в многомерном случае) функции равна 0. Таким образом, вы должны проверить x- и y-разницу в вашей функции. numpydiff функция хороша для этого случая.

Итак, если различия между двумя соседними элементами в направлениях x-y близки к 0, вы можете сказать, что эта точка является критической точкой. Именно тогда разница меняет свой знак (от отрицательного до положительного или наоборот), предполагая, что ваша функция гладкая.

# get difference in x- and y- direction 
sec_grad_x = np.diff(storm,n=1,axis=0) 
sec_grad_y = np.diff(storm,n=1,axis=1) 

cp = [] 
# starts from 1 because diff function gives a forward difference 
for i in range(1,n-1): 
    for j in range(1,n-1): 
     # check when the difference changes its sign 
     if ((sec_grad_x[i-1,j]<0) != (sec_grad_x[i-1+1,j]<0)) and \ 
      ((sec_grad_y[i,j-1]<0) != (sec_grad_y[i,j-1+1]<0)): 
      cp.append([i,j, storm[i,j]]) 

cp = np.array(cp) 
+0

Благодарим за помощь! –