7 Stimmen

Wie verwaltet man eine 2D-Fourier-Transformation (FFT) auf einem maskierten 3D-Numpy-Array?

Ich habe Probleme mit der Durchführung von 2D-Fast-Fourier-Transformationen auf einem 3D-Array. Sie sind mathematischer Natur und von einem "Verständnis Python / Numpy" Natur.

EDIT: Zur Klarstellung: Die Kernfragen lauten: Wie geht numpy.fft mit maskierten Arrays um? Kann ich den Durchschnitt über eine Achse bilden und dann eine fft durchführen und das gleiche Ergebnis erhalten wie bei einer fft und dann den Durchschnitt über die Achsen bilden, die nicht an der fft beteiligt waren?

Das Feld besteht aus einem Kohlendioxid-Flusswert (in "Einheiten") zwischen der Atmosphäre und dem Ozean für jeden Breiten- und Längengrad (in einem bestimmten Bereich). Die Form des Arrays ist (730, 50, 182) entsprechend (Zeit, Breitengrad, Längengrad). Die Landwerte werden maskiert:

import numpy as np
from numpy import ma
carbon_flux = ma.masked_values(carbon_flux, 1e+20)

Ich möchte den Logarithmus der Varianz der 2D-Fourier-Transformation von carbon_flux, gemittelt über den Längengrad, anzeigen. Ich mittle das Array über die letzte Achse (Längengrad) und führe dann die Fourier-Transformation wie folgt durch:

ft_type_1 = np.log(np.abs(np.fft.fft2(ma.mean(cflux, 2)))

So erhalte ich ein akzeptabel aussehendes Ergebnis. Mir wurde jedoch gesagt, ich solle zuerst die Mittelwertbildung vornehmen:

ft_type_2 = np.log(np.mean(np.abs(np.fft.fft2(carbon_flux, axes=(0, 1))),axis=2)

Dies führt dazu, dass die maskierten Werte zur Berechnung der fft verwendet werden (ich erkenne das daran, dass der erste Wert der fft in der Größenordnung von 10e19 liegt).

Soweit ich weiß, unterscheidet sich das Ergebnis der Mittelwertbildung vor dem fft von dem der Mittelwertbildung nach dem fft. Liege ich mit dieser Annahme richtig oder macht es keinen Unterschied, in welcher Reihenfolge ich diese Funktionen ausführe?

Verwendet die fft die maskierten Werte? Kann ich dies vermeiden?

Schließlich habe ich den Logarithmus der 2D-Fourier-Transformation von carbon_flux gemittelt über den Breitengrad berechnet. Ich verstehe nicht, wie man den Logarithmus der VARIANZ der über den Breitengrad gemittelten 2D-Fourier-Transformation berechnet. Muss der Wert meines resultierenden fft-Bildes einfach quadriert werden, um die Varianz zu erhalten?

Dies scheint eine sehr komplizierte Reihe von Fragen zu sein, aber jede Hilfe in irgendeinem Bereich wäre willkommen. Ich danke Ihnen.

5voto

aganders3 Punkte 5636

Nachdem ich mir die Dokumentation kurz angesehen habe, denke ich numpy.fft kann die Maske einfach ignorieren. Ich würde versuchen, die ma.filled() Funktion, um einen anderen Wert in alle maskierten Einträge zu setzen.

Etwa so (aus Ihrem Beispielcode):

ft_type_1 = np.log(np.abs(np.fft.fft2(ma.mean(carbon_flux.filled(cflux_fill_value), 2)))
ft_type_2 = np.log(np.mean(np.abs(np.fft.fft2(carbon_flux.filled(cflux_fill_value), axes=(0, 1))),axis=2)

wobei cflux_fill_value ist eine vernünftige Schätzung, die die maskierten Werte ersetzt. Der Füllwert kann auch in einem anderen Schritt festgelegt werden (er wird als Teil eines maskierten Arrays gespeichert) und Sie könnten dann Folgendes verwenden carbon_flux.filled() ohne ein Argument.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X