这样做就可以了:
>>> 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])
如果您想要在原地执行操作(并因此可以省略复制过程),那么这显然会更快。
cplxarr.real *= factarr
。否则,你可以尝试使用[:]
复制,然后对real
分量进行原地缩放。 - Eryk Sunndarray.copy
在复制时可能更好。当处理np.ndarrays时,[:]
应该返回一个视图而不是副本。但是直接在原地更新实际组件是个好主意。 - mgilson