これはそれを行います:
>>> 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
以下を使用する他のバージョンの約2倍の速度であることがわかりました。
>>> 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
Pythonの使用と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])
操作を適切に実行したい場合(したがって、コピーをオフのままにしておくことができます)、これは明らかにさらに高速になります。