【发布时间】:2018-09-28 22:24:47
【问题描述】:
我使用 numpy 和 fft 计算了向量。 我使用了 numpy 广播方法和 for 循环。 两种方法的速度是相似的。 如何使用多核和 numpy 和 fft 计算向量?
import numpy as np
from numpy.fft import fft, ifft
num_row, num_col = 6000, 13572
ss = np.ones((num_row, num_col), dtype=np.complex128)
sig = np.random.standard_normal(num_col) * 1j * np.random.standard_normal(num_col)
# for loop
for idx in range(num_row):
ss[idx, :] = ifft(fft(ss[idx, :]) * sig)
# broadcast
ss = ifft(fft(ss, axis=1) * sig, axis=1)
结果
loop : 10.798867464065552 sec
broadcast : 11.298897981643677 sec
【问题讨论】:
-
您可以将轴指定为
fft,而不是使用循环np.fft.fft(a, axis=1) -
您也可以使用broadcasting 进行数组乘法
ss*sig -
这到底是在做什么?您正在计算一个向量的 FFT(这只是
[N, 0, 0, 0...],其中 N 是向量的长度),乘以一些随机数据,然后是 IFFT???我想这里有一个XY problem? -
无论如何,默认的 Numpy FFT 不是多线程的:您要么必须使用 Enthought 的 Python 发行版(其中 Numpy 是针对 Intel MKL 构建的,它具有高度优化的 FFT),要么使用 PyFFTW(它依赖于 FFTW 的多线程)。或者您想尝试绕过 GIL 并使用 Python 的内置线程功能?
-
另外你可能打算做
stdn(ncol) + 1j * stdn(ncol)(注意+)。
标签: python loops numpy fft multicore