Как указал Киборг, есть только четыре различия, которые необходимо вычислить для завершения вашего вычисления (обратите внимание, что для диагональных и антидиагональных вычислений действительно должен быть коэффициент 1 / sqrt (2), если это действительно пространственноерасчет градиента по равномерной сетке).Если я понял ваш вопрос, реализация с numpy могла бы выглядеть примерно так:
A=np.random.random(100).reshape(10,10)
# Padded copy of A
B=np.empty((12,12))
B[1:-1,1:-1]=A
B[0,1:-1]=A[0,:]
B[-1,1:-1]=A[-1,:]
B[1:-1,0]=A[:,0]
B[1:-1,-1]=A[:,-1]
B[0,0]=A[1,1]
B[-1,-1]=A[-1,-1]
B[-1,0]=A[-1,0]
B[0,1]=A[0,1]
# Compute 4 absolute differences
D1=np.abs(B[1:,1:-1]-B[:-1,1:-1]) # first dimension
D2=np.abs(B[1:-1,1:]-B[1:-1,:-1]) # second dimension
D3=np.abs(B[1:,1:]-B[:-1,:-1]) # Diagonal
D4=np.abs(B[1:,:-1]-B[:-1,1:]) # Antidiagonal
# Compute maxima in each direction
M1=np.maximum(D1[1:,:],D1[:-1,:])
M2=np.maximum(D2[:,1:],D2[:,:-1])
M3=np.maximum(D3[1:,1:],D3[:-1,:-1])
M4=np.maximum(D4[1:,:-1],D4[:-1,1:])
# Compute local maximum for each entry
M=np.max(np.dstack([M1,M2,M3,M4]),axis=2)
Это оставит вас с максимальной разницей в каждом из 4 направлений ввода A в M. Аналогичная идеяможет использоваться для маркировки локально максимальных значений, завершаясь чем-то вроде
T=np.where((M==np.max(np.dstack([Ma,Mb,Mc,Md,Me,Mf,Mg,Mh]),axis=2)))
, что даст вам массив, содержащий координаты локально максимальных значений в M