2017-11-02 8 views
0

私はnumpyでndarrayを持っています。これは複雑な値を含んでいます。それぞれを2つの浮動小数点値に変換したいと思います。私はarrayrealimagでそれを試してみましたが、唯一の本当の部分は出力にnumpy複素数配列を2要素浮動小数点配列に変換するにはどうすればよいですか?

import numpy as np 

inp_array = np.array([[1,2+3.j,3,4], [5,6,7+1.j,8], [9,10,11,12]], dtype=np.complex64) 

out_array = np.array([np.real(inp_array), np.imag(inp_array)]) 

ある私は、この結果を取得したいと思います:

[[[1,0],[2,3],[3,0],[4,0]], [...], [...]] 

答えて

4

これを行うための単純かつ効率的な方法はnp.float32ビューアレイの行い、その後(m, n)inp_arrayの形状である形状(m, n, 2)を有するようにビューを調整することです。ビューを使用すると、出力配列は実際にはinp_arrayと同じメモリを使用します。

あなたの配列はinp_arrayです。

In [158]: inp_array = np.array([[1,2+3.j,3,4], [5,6,7+1.j,8], [9,10,11,12]], dtype=np.complex64) 

In [159]: inp_array 
Out[159]: 
array([[ 1.+0.j, 2.+3.j, 3.+0.j, 4.+0.j], 
     [ 5.+0.j, 6.+0.j, 7.+1.j, 8.+0.j], 
     [ 9.+0.j, 10.+0.j, 11.+0.j, 12.+0.j]], dtype=complex64) 

np.float32の配列を表示します。 (m, n)の形状がinp_arrayの場合、vは、形状が(m, 2*n)になります。

In [160]: v = inp_array.view(np.float32) 

In [161]: v 
Out[161]: 
array([[ 1., 0., 2., 3., 3., 0., 4., 0.], 
     [ 5., 0., 6., 0., 7., 1., 8., 0.], 
     [ 9., 0., 10., 0., 11., 0., 12., 0.]], dtype=float32) 

(m, n, 2)に今すぐ変更してください。 (。wあなたが​​と呼ばれるものです)

In [162]: w = v.reshape(inp_array.shape + (2,)) 

In [163]: w 
Out[163]: 
array([[[ 1., 0.], 
     [ 2., 3.], 
     [ 3., 0.], 
     [ 4., 0.]], 

     [[ 5., 0.], 
     [ 6., 0.], 
     [ 7., 1.], 
     [ 8., 0.]], 

     [[ 9., 0.], 
     [10., 0.], 
     [11., 0.], 
     [12., 0.]]], dtype=float32) 

In [164]: inp_array[1,2] 
Out[164]: (7+1j) 

In [165]: w[1,2] 
Out[165]: array([7., 1.], dtype=float32) 

カップルノート:

  • この方法inp_arrayは、 "Cの連続した" であることを前提としています。すなわち、アレイ内のデータは「C」の順序でメモリの連続したブロックに格納されます。 inp_arrayが作成された場合、たとえばより大きな配列のスライスとして作成された場合はそうではありません。
  • inp_array,vおよびwはすべて同じメモリブロックのビューです。インプレースを変更すると、すべてが変更されます。

    In [171]: w[0, 0, 0] = 99 
    
    In [172]: inp_array 
    Out[172]: 
    array([[99.+0.j, 2.+3.j, 3.+0.j, 4.+0.j], 
         [ 5.+0.j, 6.+0.j, 7.+1.j, 8.+0.j], 
         [ 9.+0.j, 10.+0.j, 11.+0.j, 12.+0.j]], dtype=complex64) 
    
2

虚部は、あなたのoutput_arrayでありますが、寸法はあなたが望む順番ではありません。

out_array = np.stack([np.real(inp_array), np.imag(inp_array)], axis=-1) 

か、.transposeを使用することができます:

することで最終ラインを交換してみてください

out_array = np.array([np.real(inp_array), np.imag(inp_array)]).transpose(1, 2, 0) 

出力を与える必要があります両方:

> out_array 
array([[[ 1., 0.], 
     [ 2., 3.], 
     [ 3., 0.], 
     [ 4., 0.]], 

     [[ 5., 0.], 
     [ 6., 0.], 
     [ 7., 1.], 
     [ 8., 0.]], 

     [[ 9., 0.], 
     [ 10., 0.], 
     [ 11., 0.], 
     [ 12., 0.]]], dtype=float32) 
0

あなたは正確にデータ出力をしたい場合あなたは尋ねました、あなたはデータをキャストしようとしています。

import numpy as np 

inp_array = np.array([[1,2+3.j,3,4], [5,6,7+1.j,8], [9,10,11,12]], dtype=np.complex64) 


out_array = [] 
for l in inp_array: 
    for e in l: 
     out_array.append(([int(np.real(e)), int(np.imag(e))])) 
out_array = np.asarray(out_array) 
print(out_array) 
関連する問題