如何在3D numpy掩码数组上进行2D傅里叶变换(FFT)?

7 投票
1 回答
4088 浏览
提问于 2025-04-17 05:52

我在处理一个三维数组的二维快速傅里叶变换时遇到了一些问题。这些问题主要是数学方面的,还有关于“理解python/numpy”的内容。

补充说明一下,核心问题是: numpy.fft是怎么处理被屏蔽的数组的? 我能否先在一个轴上取平均,然后再做傅里叶变换,得到的结果是否和先做傅里叶变换再在没有参与傅里叶变换的轴上取平均是一样的?

这个数组包含了每个纬度和经度(在某个区域内)大气和海洋之间的二氧化碳通量值(以“单位”表示)。数组的形状是(730, 50, 182),对应的是(时间,纬度,经度)。陆地的值被屏蔽,使用的是:

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

我想展示二氧化碳通量在经度上取平均后的二维傅里叶变换的方差的对数。我先在最后一个轴(经度)上取平均,然后这样做傅里叶变换:

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看出来)。

根据我的理解,先取平均和后取平均的结果是不同的。我这样理解对吗?还是说这两种顺序没有区别?

傅里叶变换会使用被屏蔽的值吗?我能避免这个问题吗?

最后,我计算了二氧化碳通量在纬度上取平均后的二维傅里叶变换的对数。我不明白如何计算纬度上取平均后的二维傅里叶变换的方差的对数。我的傅里叶变换结果的值是不是只需要平方就能得到方差?

这些问题看起来很复杂,但任何方面的帮助都非常感谢。谢谢。

1 个回答

5

看了一下文档,我觉得 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() 而不需要传入参数。

撰写回答