Ho un set di dati di simulazione dove vorrei trovare la pendenza più bassa in n dimensioni. La spaziatura dei dati è costante lungo ogni dimensione, ma non tutti uguali (potrei cambiarla per semplicità).derivata numpy seconda di un array ndimensionale
Posso vivere con qualche imprecisione numerica, specialmente verso i bordi. Preferirei fortemente non generare una spline e usare quella derivata; solo sui valori grezzi sarebbe sufficiente.
È possibile calcolare la prima derivata con numpy
utilizzando la funzione numpy.gradient()
.
import numpy as np
data = np.random.rand(30,50,40,20)
first_derivative = np.gradient(data)
# second_derivative = ??? <--- there be kudos (:
Questo è un commento per quanto riguarda Laplace rispetto alla matrice di iuta; questa non è più una domanda, ma ha lo scopo di aiutare la comprensione dei futuri lettori.
Uso come testcase una funzione 2D per determinare l'area "piatta" al di sotto di una soglia. Le seguenti immagini mostrano la differenza nei risultati tra utilizzando il minimo second_derivative_abs = np.abs(laplace(data))
e il minimo dei seguenti:
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 scala di colore rappresenta i valori funzioni, le frecce rappresentano la derivata prima (pendenza), il punto rosso la punto più vicino a zero e la linea rossa la soglia.
La funzione di generatore per i dati era (1-np.exp(-10*xi**2 - yi**2))/100.0
con xi, yi generato con np.meshgrid
.
Laplace:
dell'Assia:
Mi chiedo; Mi interessa solo la grandezza della pendenza, non tanto le direzioni.Potrebbe essere sufficiente calcolare il gradiente sulla somma delle prime voci della lista derivata assoluta? 'second_derivative = np.gradient (sum ([df * df per d in first_derivative]))' (con 'sum' che conserva la forma per il gusto dell'argomento) – Faultier
Ok, penso di capire cosa vuoi ora. Vuoi solo ottenere la regione più piatta, o qualunque cosa "più piatta" significhi in N dimensioni. Cercherò di non usare affatto una derivata seconda, ma calcola il gradiente assoluto in tutti i punti (somma sui quadrati della prima dimensione del risultato di 'np.gradient', come hai detto nel tuo commento), e poi trova la regione di soglia da quella e trova il minimo all'interno della regione di soglia (se la tua funzione è sufficientemente complicata, trovare i minimi globali può essere davvero difficile). Proverò un po 'e posterò un'altra risposta se trovo qualcosa. – Carsten
@Carsten La somma di tutti i gradienti non produrrà l'area più piatta; in questa immagine del caso di test produrrebbe il centro del gaussiano 2d. questa non è affatto la zona più piatta. Quindi penso che debba essere fatto con la seconda derivata dell'elica anziché la prima. – Faultier