4

(960,960) 配列があり、極値を見つけることができるように臨界点を見つけようとしています。

np.diff と np.gradient を使用してみましたが、問題が発生し、どの関数を使用すればよいかわかりません。

np.diff は 2 次差分を計算するオプションを提供しますが、勾配はそうではありません。

クリティカルポイントを取得するにはどうすればよいですか?

私はもう試した

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

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

derivative = dyy/dxx 

ここで問題が発生します。これは、dxx に沿った値の一部がゼロに等しいためです。

次に、次のオプションがあります

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

しかし、これは私が探しているものを私に与えるでしょうか?

4

1 に答える 1

5

臨界点は、関数の一次導関数 (多次元の場合は勾配) が 0 になる点です。したがって、関数の x と y の差を確認する必要があります。numpydiff関数はこの場合に適しています。

したがって、x-y 方向の隣接する 2 つの要素間の差が 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)
于 2014-05-08T01:02:18.353 に答える