pyfftw中的计划和行子集

时间:2017-04-17 21:00:30

标签: pyfftw

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

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

我的问题是:是否可以对部分行使用相同的FFTW3计划,而不为所有可能的行组合创建单独的pyfftw.FFTW个对象?< / p>

另一方面,我想知道pyfftw如何使用多个核心:它是否为每一行使用多个核心(这在FFTW3文档中看起来很自然)或者是否会将不同的行划分出来到不同的核心(这是我最初的假设)?

1 个答案:

答案 0 :(得分:0)

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

这意味着几件事:

  1. 您的阵列需要有规律的步幅,但这些步幅可以是任意的。
  2. ND阵列计划为ND变换,使用选定的轴。
  3. 你可以用狡猾的技巧做一些狡猾的事情并且它可能会起作用(但是如果你做了像重叠行那样过于邪恶的事情然后使用线程,那么可能不会做你期望的事情。)
  4. 我使用过的一个解决方案是将要转换的行复制到临时数组中,然后对其进行转换。您可能会发现这是最快的选择(特别是当您可以允许字节偏移正确时)。

    显然,如果你总是有不同的行数,这不起作用。您可能仍然会发现,如果您计划转换的最大行数,然后在子集中进行复制,则仍然比其他方式更快。<​​/ p>

    即使您降到C级别,您遇到的问题仍然是,如果您经常更改转换大小,规划费用可能会占主导地位。

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