python - scipy.fftpack 的 FFT 冻结
问题描述
在计算大小为约 150 万个项目的数组的 FFT 时:
import numpy as np
from scipy.fftpack import fft
x0 = np.ones(1492828, dtype=np.int32)
fft(x0)
print 'hello'
FFT 计算永远不会完成,程序正在冻结。如果我更改1492828
为1492827
,它似乎工作。但是,如果我更改1492828
为1492826
,它仍然会冻结,这有点奇怪。
这是一个已知的错误?
笔记:
CPU 保持在 25%(正常,我有一个 4 核 CPU),Python 进程的 RAM 使用率保持在 ~75 MB
我在 Windows 7 64 位上使用 Python 2.7.15 64 位:
print scipy.__version__ # 1.1.0 print sys.version # 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]
解决方案
通常的 FFT 算法对于具有小的素因数的长度要快得多,如此处所述。
解决方案是将数组补零到 2 的下一个幂:
def zeropad_nextpoweroftwo(A):
return np.concatenate([A, np.zeros(int(2 ** np.ceil(np.log2(len(A))))-len(A),
dtype=A.dtype)])
或者,一个更简单/更好的解决方案是使用第二个参数允许自动填充零next_fast_len
的事实:fftpack.fft
fftpack.fft(a, next_fast_len(len(a)))
推荐阅读
- full-text-search - 需要在字符串标签中搜索“like”时如何设置 CosmosDB
- javascript - 在 redux-saga 调用调用的函数中对“this”的引用为空
- r - R 编程中的 For 循环和 If
- jquery - 将表单 onsubmit 参数与 jquery 提交事件处理程序相结合
- theos - 如何在应用程序中显示我的调整首选项包?
- xamarin.forms - Xamarin Forms CollectionView 命令不起作用
- python - 导入标识符的未解析引用,稍后重写
- apache - htaccess - 当多个域指向同一服务器时,需要将一个非 https 域重定向到 https
- javascript - 如何使用 Javascript 对 HTML 表单中的结果进行排名?
- c++ - 我可以让返回类型 auto 与具有相同签名但不同捕获的 lambda 一起使用吗?