python - 缩放复杂 numpy 数组的实部

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

(是的,它是关于在非常特定的设置下人类听觉的频率响应。)
显然,与上述向量的乘法也缩放了虚部。

如何设置 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

使用 np.complex 似乎没有太大区别和 complex由 python 提供:

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

TIMINGS STANDINGS 中的当前领导者(由 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/

相关文章:

python - 检查是否传递了所需的变量

python - 将格式错误的 csv 文件转换为 numpy 数组

Python指数运算符和复数

c++ - 为什么 (0+0i)^{0} == (nan, nan) 在 C++ 中

python - 如何在 numpy 矩阵中使用这个复数?

Python - 不带单引号的字符串列表

python - os.system 不将结果写入输出文件

python - 将值插入不带索引的数组

python - 将 ndarray 列表折叠为矩阵

python - numpy 字符数组到字符串