【问题标题】:How to manage a 2D Fourier Transform(FFT) on a 3D numpy masked array?如何在 3D numpy 掩码数组上管理 2D 傅里叶变换(FFT)?
【发布时间】:2011-12-24 13:28:05
【问题描述】:

我在对 3D 数组执行 2D 快速傅立叶变换时遇到问题。它们具有数学性质和“理解 python/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 的 2D 傅里叶变换在经度上平均的方差的对数。我在最后一个轴(经度)上平均数组,然后像这样进行傅里叶变换:

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)

这导致使用掩码值来计算 fft(我可以通过 fft 的第一个值来判断为 10e19 的数量级)。

据我了解,在 fft 之前进行平均的结果与在 fft 之后进行平均的结果不同。我的假设是正确的,还是我执行这些功能的顺序没有区别?

fft 是否使用掩码值?我可以避免这种情况吗?

最后,我计算了 carbon_flux 在纬度上平均的二维傅里叶变换的对数。我不明白如何计算以纬度平均的二维傅里叶变换方差的对数。我得到的 fft 图像的值是否只需平方即可成为方差?

这似乎是一系列非常复杂的问题,但任何部门的任何帮助都将不胜感激。谢谢。

【问题讨论】:

  • 首先,我不知道 numpy.fft 如何处理这些。但是,FT 是线性运算,所以只要在取绝对值之前对数据进行平均,它应该不会真正产生影响。
  • @aganders3 谢谢。是的,这在实践中似乎是正确的。结果得到的两个数字几乎完全相同。我想知道这些细微差别从何而来?

标签: python math numpy fft


【解决方案1】:

简要查看文档后,我认为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() 而不带参数。

【讨论】:

  • 忽略我假设你的意思是 numpy.fft 使用数组被屏蔽之前的内容。我用平均值替换了 carbon_flux 的掩码值:carbon_flux_data = ma.getdata(carbon_flux) 然后i= np.where(carbon_flux_data > 1e19) 然后carbon_flux_data[i] = ma.mean(carbon_flux)。这会给 ft_type_1[0, 0] 零频率项(信号的平均值)提供更准确的值吗?
  • 简短回答:是的,可能。我不熟悉你的数据,但它似乎是用一些传感器收集的,这些传感器在一些测量中失控,给出的值 > 1e9。它是否正确?由于您不知道必须猜测的值 - 用平均值替换是一种选择,并且可能是一个很好的猜测。另一种选择是根据附近时间/位置的测量值来猜测这些点。您可能对数据了解得更多,所以我将告诉您如何最好地填写空白。这可能无关紧要,具体取决于“缺失”的值的数量。
  • 另外,回复:您帖子的第一部分。我认为numpy.fft 正在使用数组被屏蔽之前的状态。我认为使用carbon_flux.filled(ma.mean(carbon_flux)) 应该和你描述的一样。我建议用零填充,因为这在我的领域 (MRI) 中很常见,但对于您的情况可能不是最好的主意!
  • 谢谢!掩蔽数据代表土地价值,因为陆地上没有海气交换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 2021-07-26
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
相关资源
最近更新 更多