これを行うための単純かつ効率的な方法は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)