缩放复杂numpy数组的实部

tzo*_*zot 4 python numpy complex-numbers

我有一个复数向量(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])
Run Code Online (Sandbox Code Playgroud)

(是的,它是关于非常具体的人类听觉频率响应.)
显然,与上面的矢量相乘也会对虚部进行缩放.

如何设置factarr以及我必须执行哪些操作才能获得所需的结果?如果它完全可能,也就是说,在不分离实部和虚部的情况下,缩放实部并重新组合为新的复矢量.

mgi*_*son 8

这样做:

>>> factarr*cplxarr.real + (1j)*cplxarr.imag
array([ 0.5+2.j,  1.8+1.j,  1.4-2.j])
Run Code Online (Sandbox Code Playgroud)

不知道这是不是最好的方式.


事实证明,对我来说至少(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
Run Code Online (Sandbox Code Playgroud)

它似乎没有在使用np.complexcomplexpython提供之间有太大的区别:

>>> timeit('f(cplxarr.real * factarr, cplxarr.imag)',setup='from __main__ import  factarr,cplxarr; import numpy as np; f=np.vectorize(complex)')
44.87726283073425
Run Code Online (Sandbox Code Playgroud)

时间表中的当前领导者(eryksun在下面的评论中提出)

>>> timeit.timeit('a = cplxarr.copy(); a.real *= factarr ',setup='from __main__ import factarr,cplxarr')
8.336654901504517
Run Code Online (Sandbox Code Playgroud)

并证明它有效:

>>> a = cplxarr.copy()
>>> a.real *= factarr 
>>> a
array([ 0.5+2.j,  1.8+1.j,  1.4-2.j])
Run Code Online (Sandbox Code Playgroud)

如果你想在适当的位置进行操作,那么这显然会更快(因此可以将副本关闭).

  • @tzot:你想要这样做吗?那只是`cplxarr.real*= factarr`.否则,你可以尝试一个`[:]`副本,然后是`real`组件的就地缩放. (2认同)