我有一个复数向量(FFT 的结果),我只想按另一个向量中的因子缩放复数的实部。
例子
cplxarr= np.array([1+2j, 3+1j, 7-2j])
factarr= np.array([.5, .6, .2])
# desired result of cplxarr * factarr :
# np.array([.5+2j 1.8+1j 1.4-2j])
(是的,这是关于在非常特定的环境中人类听觉频率响应。)显然,与上述向量的乘法也会缩放虚部。
如何设置
factarr
以及需要进行哪些操作才能达到预期效果?如果可能的话,即不分离实部和虚部,缩放实部并重新组装为新的复数向量。 最佳答案
这样做:
>>> factarr*cplxarr.real + (1j)*cplxarr.imag
array([ 0.5+2.j, 1.8+1.j, 1.4-2.j])
不确定这是否是最好的方法。
事实证明,至少对我来说(OS-X 10.5.8,python 2.7.3,numpy 1.6.2)这个版本的速度大约是另一个使用
np.vectorize
的版本的两倍:>>> from timeit import timeit
>>> timeit('factarr*cplxarr.real+(1j)*cplxarr.imag',setup='from __main__ import factarr,cplxarr')
21.008132934570312
>>> timeit('f(cplxarr.real * factarr, cplxarr.imag)',setup='from __main__ import factarr,cplxarr; import numpy as np; f=np.vectorize(np.complex)')
46.52931499481201
使用 python 提供的
np.complex
和 complex
似乎没有太大区别:>>> timeit('f(cplxarr.real * factarr, cplxarr.imag)',setup='from __main__ import factarr,cplxarr; import numpy as np; f=np.vectorize(complex)')
44.87726283073425
时间排名的当前领导者 (由 eryksun 在下面的评论中提出)
>>> timeit.timeit('a = cplxarr.copy(); a.real *= factarr ',setup='from __main__ import factarr,cplxarr')
8.336654901504517
并证明它有效:
>>> a = cplxarr.copy()
>>> a.real *= factarr
>>> a
array([ 0.5+2.j, 1.8+1.j, 1.4-2.j])
如果您想就地执行操作(因此可以关闭副本),这显然会更快。
关于python - 缩放复杂 numpy 数组的实部,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13567089/