Skip to main content
 首页 » 编程设计

python之如何将 numpy 复杂数组转换为两个元素的 float 组

2025年05月04日10Leo_wl

我在 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)