我有一个numpy中的ndarray,它包含复杂的值.我想将每个转换为两个浮点值.我试了一下array real,并imag,但只有真正的部件在输出
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)])
Run Code Online (Sandbox Code Playgroud)
我想得到这个结果:
[[[1,0],[2,3],[3,0],[4,0]], [...], [...]]
Run Code Online (Sandbox Code Playgroud)
一个简单而有效的方法是创建一个数组np.float32 视图,然后调整视图以获得形状(m, n, 2),(m, n)其形状为inp_array.通过使用视图,输出数组实际上使用相同的内存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)
Run Code Online (Sandbox Code Playgroud)
使用类型查看数组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)
Run Code Online (Sandbox Code Playgroud)
现在重塑到(m, n, 2).(w就是你所说的out_array.)
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)
Run Code Online (Sandbox Code Playgroud)
几个笔记:
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)
Run Code Online (Sandbox Code Playgroud)虚部在您的 中output_array,但尺寸不是您想要的顺序。
尝试将最后一行替换为:
out_array = np.stack([np.real(inp_array), np.imag(inp_array)], axis=-1)
Run Code Online (Sandbox Code Playgroud)
或者你可以使用.transpose:
out_array = np.array([np.real(inp_array), np.imag(inp_array)]).transpose(1, 2, 0)
Run Code Online (Sandbox Code Playgroud)
两者都应该给出输出:
> 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1843 次 |
| 最近记录: |