Ich habe eine Funktion, um die endliche Differenz eines 1d np.array zu berechnen, und ich möchte auf ein n-d-Array extrapolieren."Dynamische" N-dimensionale endliche Differenz in Python entlang einer Achse
Die Funktion ist wie folgt:
def fpp_fourth_order_term(U):
"""Returns the second derivative of fourth order term without the interval multiplier."""
# U-slices
fm2 = values[ :-4]
fm1 = values[1:-3]
fc0 = values[2:-2]
fp1 = values[3:-1]
fp2 = values[4: ]
return -fm2 + 16*(fm1+fp1) - 30*fc0 - fp2
Es ist die 4. Ordnung Multiplikator (1/(12*h**2)
) fehlt, aber das ist ok, weil ich multiplizieren, wenn die Bedingungen zu gruppieren.
Ich würde es gerne als N-dimensional erweitern. Denn das würde ich folgende Änderungen tun:
def fpp_fourth_order_term(U, axis=0):
"""Returns the second derivative of fourth order term along an axis without the interval multiplier."""
# U-slices
Aber hier ist das Problem
fm2 = values[ :-4]
fm1 = values[1:-3]
fc0 = values[2:-2]
fp1 = values[3:-1]
fp2 = values[4: ]
Dieses in 1D funktioniert gut, wenn ist 2D entlang der ersten Achse zum Beispiel würde ich ändern müssen so etwas wie:
fm2 = values[:-4,:]
fm1 = values[1:-3,:]
fc0 = values[2:-2,:]
fp1 = values[3:-1,:]
fp2 = values[4:,:]
Aber entlang der zweite Achse wäre:
fm2 = values[:,:-4]
fm1 = values[:,1:-3]
fc0 = values[:,2:-2]
fp1 = values[:,3:-1]
fp2 = values[:,4:]
Das Gleiche gilt für 3D, hat aber 3 Möglichkeiten und geht weiter und weiter. Die Rückgabe funktioniert immer, wenn die Nachbarn richtig eingestellt sind.
return -fm2 + 16*(fm1+fp1) - 30*fc0 - fp2
Natürlich axis
kann nicht größer sein als len(U.shape)-1
(I nenne dies die Dimension, ist es eine Möglichkeit, statt diese Schnipsel zu extrahieren?
Wie kann ich einen eleganten und pythonic Ansatz für diese Codierung Problem zu tun?
gibt es einen besseren Weg, es zu tun
PS: In Bezug auf np.diff
und np.gradient
, diejenigen nicht funktionieren, da die erste erster Ordnung und die zweite i s zweite Ordnung, ich mache eine Näherung vierter Ordnung. In der Tat beende ich bald dieses Problem, ich werde auch den Auftrag verallgemeinern. Aber ja, ich möchte in der Lage sein, in jeder Achse wie np.gradient
zu tun.
elegant zu viel sein kann fragen, aber [diese] (https://stackoverflow.com/q/42817508/7207392) [links] (https://stackoverflow.com/q/24398708/7207392) kann Ihnen helfen, anzufangen. –
Der 'slice' Modus unterstützt ** fancy ** Indizierung nicht als' U [:, 1: -3] 'andersrum (mit' np.take') vage unterstützt, ich muss die Bereiche (seit 'range (1, -1)' ist bedeutungslos), auch 'np.take' kopiert die Daten (die ich vermeiden will. Aber danke. Ich mache Fortschritte. – Lin
Dinge wie 'fc0 = values.take (indices = Bereich (2, values.shape [Achse] -2), Achse = Achse) ', funktioniert, aber das Array 5 mal kopieren wird meine Erinnerung in den Kopf schießen.Diese Arrays werden groß. : -/ – Lin