这是你的计算和选择,更numpythonic对其采取:
compdata = [[np.exp(t_range*sflist[y]) for y in x] for x in sfcube]
compdata2 = np.take(np.exp(sflist[:, None] * t_range), sfcube, axis=0)
有了这个样本数据集基于你的问题:
sfcube = np.random.randint(2, size=(100, 100))
delta_time_ns = 100
number_of_points_for_fft = 1024
time_axis_ns = np.array([x*delta_time_ns for x in xrange(number_of_points_for_fft)])
t_range = 1j*2*np.pi*time_axis_ns
sflist = np.array([ 29500000., 30500000.])
我得到这些时间:
In [3]: %timeit compdata = [[np.exp(t_range*sflist[y]) for y in x] for x in sfcube]
1 loops, best of 3: 1.76 s per loop
In [4]: %timeit compdata2 = np.take(np.exp(sflist[:, None] * t_range), sfcube, axis=0)
10 loops, best of 3: 72.2 ms per loop
这是一个20倍的加速,虽然你的结果会改变,这取决于实际尺寸sflist
和sfcube
。而你得到的是一个三维numpy的阵列,而不是一个数组列表的列表中,虽然它们在大多数的设置可以互换,当然:
In [5]: np.allclose(compdata, compdata2)
Out[5]: True
您已经标记了的问题为'bumpy',但似乎就像你在最慢的部分使用普通的Python列表理解一样。 'sfcube'和'sflist' numpy数组?如果是这样,你可以做一些聪明的索引来向量化指数。 – mbatchkarov
是的,sfcube和sflist都是numpy数组 – HenrikW
'compdata = np.exp([[(t_range * sflist [y])for y in x] for s in sfcube])'这应该会更快。如果您一次使用整个numpy列表或numpy数组的函数,它将在C中迭代,并且会比python迭代快得多。 – Froyo