1

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

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

我的问题是:是否可以对某些FFTW3行使用相同的计划,而无需为所有可能的行组合创建单独的对象?pyfftw.FFTW

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

4

1 回答 1

0

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

这意味着几件事:

  1. 您的数组需要有规律的步幅,但这些步幅可以是任意的。
  2. ND 阵列被计划为 ND 变换,使用选定的轴。
  3. 您可能可以通过跨步技巧做一些狡猾的事情,并且它可能会起作用(但如果您做了一些过于邪恶的事情,例如重叠行然后使用线程,则可能不会达到您的预期)。

我经常使用的一种解决方案是将要转换的行复制到临时数组中,然后对其进行转换。您可能会发现这是最快的选择(尤其是当您可以允许正确获取字节偏移时)。

显然,如果您总是有不同的行数,这将不起作用。您可能仍然会发现,如果您计划转换的最大行数然后复制到一个子集中,您仍然比其他方式更快。

即使您降到 C 级别,您也会遇到的问题是,如果您经常更改变换大小,那么规划开销可能会占主导地位。

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

于 2017-04-18T09:02:26.737 回答