Как управлять двумерным преобразованием Фурье (БПФ) на массиве с 3D-массивами? - PullRequest
6 голосов
/ 08 ноября 2011

У меня проблемы с выполнением 2D быстрых преобразований Фурье на трехмерном массиве.Они имеют математическую природу и «понимание питона / numpy».

РЕДАКТИРОВАТЬ: Для пояснения, основные вопросы: Как numpy.fft работает с замаскированными массивами?Могу ли я усреднить по оси, а затем выполнить fft и получить тот же результат, что и при выполнении fft, а затем усреднить по осям, которые не были задействованы в fft?

Массив состоит из значения потока двуокиси углерода (в «единицах») между атмосферой и океаном для каждого градуса широты и долготы (в определенной области).Форма массива (730, 50, 182) соответствует (время, широта, долгота).Значения земель маскируются с использованием:

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

Я хотел бы показать логарифм дисперсии двумерного преобразования Фурье для carbon_flux, усредненного по долготе.Я усредняю ​​массив по последней оси (долготе), а затем выполняю преобразование Фурье следующим образом:

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

Это дает мне приемлемый результат.Тем не менее, мне сказали сначала выполнить усреднение:

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

Это приводит к тому, что маскированные значения используются для вычисления БПФ (я могу сказать, что первое значение БПФ порядка 10e19),

Из того, что я понимаю, результат выполнения усреднения до fft будет отличаться от выполнения усреднения после fft.Я прав в предположении или нет разницы в том, в каком порядке я выполняю эти функции?

Использует ли fft маскированные значения?Можно ли этого избежать?

Наконец, я вычислил лог двумерного преобразования Фурье для carbon_flux, усредненного по широте.Я не понимаю, как рассчитать логарифм ВАРИАНТА 2D-преобразования Фурье, усредненного по широте.Нужно ли просто возводить в квадрат значение моего результирующего изображения БПФ, чтобы получить дисперсию?

Похоже, это очень сложная серия вопросов, но любая помощь в любом отделе будет признательна.Спасибо.

1 Ответ

4 голосов
/ 08 ноября 2011

После краткого изучения документации, я думаю, numpy.fft может просто игнорировать маску.Я бы попробовал использовать функцию ma.filled(), чтобы поместить какое-то другое значение во все маскированные записи.

Примерно так (по примеру кода):

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)

где cflux_fill_valueявляется разумным предположением, чтобы заменить маскированные значения.Значение заливки также можно установить на другом шаге (оно сохраняется как часть маскированного массива), а затем вы можете использовать carbon_flux.filled() без аргумента.

...