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

Ite*_*tor 1 python numpy

我有一个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)

War*_*ser 6

一个简单而有效的方法是创建一个数组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)


myr*_*cat 5

虚部在您的 中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)