如何将numpy复数数组转换为两元素float数组?

时间:2017-11-02 23:23:20

标签: python numpy

我有一个numpy中的ndarray,它包含复杂的值。我想将每个转换为两个浮点值。我使用array realimag进行了尝试,但只有实际部分在输出中

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]], [...], [...]]

3 个答案:

答案 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_arrayinp_arrayv都是同一块内存的所有视图。如果您就地更改了一个,它们都会改变:

    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)