我有一个(960,960)数组,我正试图找到关键点,以便找到局部极值。
我尝试过使用np.diff和np.gradient,但是我遇到了一些麻烦,我不确定要使用哪个函数。
np.diff提供了计算二阶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)
但是这会给我我想要的东西吗?
答案 0 :(得分:3)
临界点是函数的一阶导数(或多维情况下的梯度)为0的点。因此,您应该检查函数的x和y-差异。 numpy
diff
函数适用于此情况。
因此,如果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)