segunda derivada numpy de una matriz ndimensional

Tengo un conjunto de datos de simulación donde me gustaría encontrar la pendiente más baja en n dimensiones. El espaciado de los datos es constante a lo largo de cada dimensión, pero no de todos modos (podría cambiar eso por simplicidad).

Puedo vivir con cierta inexactitud numérica, especialmente hacia los bordes. Preferiría no generar una spline y usar esa derivada; solo en los valores brutos sería suficiente.

Es posible calcular la primera derivada connumpy utilizando lanumpy.gradient() función.

import numpy as np

data = np.random.rand(30,50,40,20)
first_derivative = np.gradient(data)
# second_derivative = ??? <--- there be kudos (:

Este es un comentario sobre laplace versus la matriz hessiana; Esto ya no es una pregunta, sino que está destinado a ayudar a la comprensión de los futuros lectores.

Utilizo como caso de prueba una función 2D para determinar el área 'más plana' por debajo de un umbral. Las siguientes imágenes muestran la diferencia en los resultados entre usar el mínimo desecond_derivative_abs = np.abs(laplace(data)) y el mínimo de lo siguiente:

second_derivative_abs = np.zeros(data.shape)
hess = hessian(data)
# based on the function description; would [-1] be more appropriate? 
for i in hess[0]: # calculate a norm
    for j in i[0]:
        second_derivative_abs += j*j

La escala de colores representa los valores de las funciones, las flechas representan la primera derivada (gradiente), el punto rojo el punto más cercano a cero y la línea roja el umbral.

La función del generador para los datos fue( 1-np.exp(-10*xi**2 - yi**2) )/100.0 con xi, yi se genera connp.meshgrid.

Laplace:

Arpillera:

Respuestas a la pregunta(3)

Su respuesta a la pregunta