【问题标题】:Scale the real part of complex numpy array缩放复杂的numpy数组的实部
【发布时间】:2012-11-14 01:29:22
【问题描述】:

我有一个复数向量(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,我需要做什么操作才能达到预期的效果?如果有可能的话,也就是说,不用分离实部和虚部,缩放实部并重新组装成一个新的复数向量。

【问题讨论】:

    标签: python numpy complex-numbers


    【解决方案1】:

    这样就可以了:

    >>> 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.complexcomplex似乎没有太大区别:

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

    目前的时间领先者(由 eryksun 在下面的 cmets 中提出)

    >>> 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])
    

    如果您想在原地执行操作,这显然会更快(因此可以关闭副本)。

    【讨论】:

    • (+1) 我更喜欢你的版本。
    • @NPE -- 在我想出一个首选的解决方案之前,我必须timeit ;-)
    • 谢谢;那当然是拆卸/重新组装的方法。我暂时不会选择你的答案,让别人有机会提供不同的答案,如果有这样的野兽。
    • @tzot:你想要这个就位吗?那只是cplxarr.real *= factarr。否则,您可以尝试 [:] 副本,然后是 real 组件的就地缩放。
    • @eryksun -- 我认为ndarray.copy 可能更适合复制。 [:] 在处理 np.ndarrays 时应该返回一个视图,而不是一个副本。但是只更新实际的组件是个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2011-02-05
    • 1970-01-01
    • 2016-04-14
    • 2011-11-23
    相关资源
    最近更新 更多