如何在Python中找到二维数组的临界点?

4

我有一个(960,960)的数组,我正在尝试找到临界点,以便找到局部极值。

我已经尝试使用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)

但这样做能满足我的需求吗?
1个回答

5
关键点是函数的一阶导数(或多维情况下的梯度)为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)

感谢您的帮助! - Eddie E Massey III

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接