计划和pyfftw行的子集

问题描述:

我想使用pyfft重复计算二维数组行的子集的离散傅里叶变换。我不知道我需要转换哪些行,这取决于前一轮的输出。我知道,为所有行做它是浪费。计划和pyfftw行的子集

根据我的理解,FFTW3中的'计划'与变换类型(c2c,r2c等)和输入/输出长度相关,输入/输出长度在1D情况下总是一个向量。在pyfftw中,它看起来像一个'计划'与变换类型和输入/输出形状相关联,所以我的解释是它对每一行都使用相同的FFTW3计划。

我的问题是:是否有可能使用行的一些相同FFTW3规划,但对行的所有可能的组合创建单独的pyfftw.FFTW对象吗?

在不同的音符,我想知道如何pyfftw使用多个内核:它使用多个内核的每一行(这似乎鉴于FFTW3文档的天然)或它外包给不同的内核不同行(这是我的初始假设)?

如果你可以从视图创建一个numpy数组,你可以使用pyFFTW进行规划 - 所有有效的numpy数组应该工作得很好。

这意味着几件事情:

  1. 你的阵列需要有正规的进步,但这些进步可以是任意的。
  2. 将ND阵列规划为ND变换,并使用选定的轴。
  3. 你可能会用一些狡猾的技巧做一些狡猾的事情,它可能会起作用(但是如果你做了一些像重叠行那样邪恶的事情,然后使用线程,可能不会达到你期望的效果)。

我已经使用过很多的解决方案之一是将要转换的行复制到临时数组中,并将其转换。您可能会发现这是最快的选项(特别是当您可以允许正确的字节偏移量时)。

显然,如果您始终有不同数量的行,则这不起作用。您仍然可以发现,如果您计划转换的最大行数,然后复制到子集中,您仍然可以做得比其他方式快。

即使您进入C级别,您将面临的问题是如果您经常更改变换大小,则计划开销可能会占优势。

您也可以尝试pyfftw.interfaces.numpy_fft,它通常比numpy更快并且能够缓存重复的变换大小。

+0

亨利,感谢您的pyfftw和您的快速回复!你能澄清第二个项目吗?如果您只为2D阵列选择轴“-1”,那么计划是否只发生在单行(例如第一行)? 我试过pyfftw.interfaces.numpy_fft,它的效果很好,但我试图从我的机器中挤出更多的果汁。 另外,如果你能说一些关于我的第二个问题,我将不胜感激。 – Ton

+0

不,轴参数告诉pyFFTW要使用哪个轴,而不是使用哪个特定的切片。如果你想分割一个数组,你首先需要做到这一点。 –

+0

在详细研究了您的pyfftw代码以及FFTW手册之后,我意识到我的问题更多的是关于FFTW而不是pyfftw。细节是[这里](https://*.com/questions/44503726)。 – Ton