我在 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)])
我想得到这个结果:
[[[1,0],[2,3],[3,0],[4,0]], [...], [...]]
请您参考如下方法:
一个简单有效的方法是创建数组的 np.float32 view,然后调整 View 的形状为 (m , n, 2),其中(m, n)是inp_array的形状。通过使用 View ,输出数组实际上使用与 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)
现在 reshape 为(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)
一些注意事项:
- 此方法假定
inp_array是“C 连续的”。也就是说,数组中的数据以“C”顺序存储在连续的内存块中。如果创建了inp_array,则情况可能并非如此,例如,作为更大数组的一部分。 inp_array、v和w都是同一 block 内存的 View 。如果您就地更改一个,它们都会更改: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)
