2016-08-11 8 views
1

実数部と虚数部を別々にした連続NumPy配列に変換したい複素数型NumPy配列があります。この複素NumPy配列を実数部と虚数部の(n、2)配列に変換する

import numpy 

u = numpy.array([ 
    1.0 + 2.0j, 
    2.0 + 4.0j, 
    3.0 + 6.0j, 
    4.0 + 8.0j 
    ]) 

u2 = numpy.ascontiguousarray(numpy.vstack((u.real, u.imag)).T) 

は、トリックを行いますが、移調は、vstackingは、連続した配列に変換するはあまりおそらくステップまたは2です。

私にこれを行うネイティブNumPy関数はありますか?

答えて

2

選択肢のなしnativeあるかリシェイプに保存し、転置など

例えば内部column_stackは、2Dの「列」配列にその入力を変換します。効果的には、それぞれが1行の2D配列で確認し、atleast_2d(m)介し

In [1171]: np.concatenate((np.array(u.real,ndmin=2).T,np.array(u.imag,ndmin=2).T),axis=1) 
Out[1171]: 
array([[ 1., 2.], 
     [ 2., 4.], 
     [ 3., 6.], 
     [ 4., 8.]]) 

vstackはその入力を渡す行っています。 np.dstackatleast_3d(m)を使用します。

新しい機能は、それが連結するための寸法を補正するNoneインデクシングを使用np.stack

In [1174]: np.stack((u.real,u.imag),-1) 
Out[1174]: 
array([[ 1., 2.], 
     [ 2., 4.], 
     [ 3., 6.], 
     [ 4., 8.]]) 

あります。効果的に:

すべて使用終了np.concatenate;それとnp.arrayはコンパイルされた結合関数です。

別のトリックは、複素値が2台の隣接するフロートとして保存されview

In [1179]: u.view('(2,)float') 
Out[1179]: 
array([[ 1., 2.], 
     [ 2., 4.], 
     [ 3., 6.], 
     [ 4., 8.]]) 

を使用することです。したがって、同じデータバッファは純粋な浮動小数点数として、またはこのビューでは浮動小数点数の2次元配列として見ることができます。 concatenateファンクションとは対照的に、ここにはコピーはありません。

uが2d以上の場合、何が起こるかを尋ねることができます。

1

あなたがdstackを使用することができます。

np.dstack((u.real, u.imag))[0] 
#Out[210]: 
#array([[ 1., 2.], 
#  [ 2., 4.], 
#  [ 3., 6.], 
#  [ 4., 8.]]) 
3

あなたはcolumn_stackを使用して、単一の2次元アレイを作製するために列として2つの1次元アレイを積み重ねることができます。

In [9]: np.column_stack((u.real,u.imag)) 
Out[9]: 
array([[ 1., 2.], 
     [ 2., 4.], 
     [ 3., 6.], 
     [ 4., 8.]]) 
+1

私はちょうどこれをチェックアウトしました:)それは醜いインデックス作成を避けます! –

関連する問題