interpolieren die fehlenden Werte 2d-python
Ich habe ein 2d-array(oder matrix, wenn Sie bevorzugen), mit ein paar fehlenden Werte dargestellt als
NaN
. Die fehlenden Werte werden in der Regel in einem Streifen entlang einer Achse, z.B.:
1 2 3 NaN 5
2 3 4 Nan 6
3 4 Nan Nan 7
4 5 Nan Nan 8
5 6 7 8 9
wo würde ich gerne ersetzen, die NaN
's durch etwas vernünftiges zahlen.
Schaute ich in delaunay triangulation, fand aber nur sehr wenig Dokumentation.
Versuchte ich mit astropy
's convolve, wie es unterstützt die Verwendung von 2d-arrays, und ist Recht einfach.
Das problem dabei ist, dass die Faltung ist keine interpolation, es bewegt sich alle Werte auf den Mittelwert (das könnte verhindert werden, indem eine schmale kernel).
Diese Frage sollte die Natürliche 2-dimensionale Erweiterung von dieser Beitrag. Gibt es eine Möglichkeit, zu interpolieren, über NaN
/fehlende Werte in ein 2d-array?
- Es gibt viele Möglichkeiten, wie Sie könnte, interpoliert diese. Eine Schwierigkeit ist, dass Ihre Daten nicht mehr rechteckig, und viele einfache 2d-interpolation-algorithmen erfordern, aber es ist immer noch möglich. Haben Sie Besondere Anforderungen für die interpolation?
- Zum Beispiel diese docs.scipy.org/doc/scipy-0.14.0/reference/generated/... vermutlich tut Sie das, was Sie brauchen. Nur pass in die Daten-Punkte, die nicht NaN und dann resample am NaN nach Konstruktion der interpolation.
- Auch diese Frage: stackoverflow.com/questions/5146025/... zu sein scheint, im wesentlichen die gleichen.
- Vielen Dank für die links, ich denke,
griddata
in der Nähe, was ich suchte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie können mit
scipy.interpolieren.griddata
und maskierte array, und Sie können wählen Sie die Art der interpolation, dass Sie lieber mit dem argumentmethod
Regel'cubic'
machen eine hervorragende Arbeit:Dass so ähnlich aussieht, wie diese mit
plt.imshow(array,interpolation='nearest')
:
Dies ist das Ergebnis:
Sehen, dass, wenn die nan-Werte an den Rändern und sind umgeben von nan-Werte thay kann nicht interpoliert werden und sind gehalten
nan
. Sie können ändern Sie es mit derfill_value
argument.Wie würde das funktionieren, wenn es eine 3x3 region von NaN-Werten, würden Sie bekommen sinnvolle Daten für den mittleren Punkt?
Es hängt von Ihrer Art von Daten, führen Sie einige Tests. Sie könnten zum Beispiel Maske auf Zweck einige gute Daten versuchen, verschiedene Art von interpolation, die z.B. kubisch, linear etc. etc. mit der array mit den maskierten Werte und calculuate die Differenz zwischen den Werten interpoliert und die ursprünglichen Werte, Sie waren maskiert, bevor Sie und sehen, welche Methode Sie wieder den kleinen Unterschied.
Können Sie so etwas wie dieses:
Gibt so etwas wie dieses:
Dies ist natürlich für Zufallszahlen, so ist es normal, dass das Ergebnis stark variieren. Also das beste, was zu tun ist, um zu testen, auf "absichtlich maskiert" Stück von deinem dataset und sehen, was passiert.
Ich würde eigentlich manuell gehen durch diese matrix Zeile für Zeile, und immer, wenn Sie beginnen, die Begegnung mit einer Liste von Nans, behalten Sie die Zahl, die unmittelbar vor der Nans und sofort nach, und die Zahl der Nans Sie sah, bevor Sie zurück zu normalen zahlen. Nachdem diese zahlen gefunden werden, wäre es möglich, zu überschreiben Nans mit interpolierten Werte selbst.