我有一个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]], [...], [...]]
答案 0 :(得分:6)
执行此操作的一种简单有效的方法是制作数组的np.float32
视图,然后调整视图以使其具有形状(m, n, 2)
,其中{{1 } (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)
的数组。如果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
。)
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)
是" C连续"。也就是说,数组中的数据存储在" C"的内存中的连续块中。订购。如果创建inp_array
,则可能不是这种情况,例如,作为更大数组的切片。 inp_array
,inp_array
和v
都是同一块内存的所有视图。如果您就地更改了一个,它们都会改变:
w
答案 1 :(得分: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)
答案 2 :(得分:0)
如果您希望完全按照要求输出数据,则必须输入将数据转换为int
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)