Python 如何将numpy复杂数组转换为两元素浮点数组?

Python 如何将numpy复杂数组转换为两元素浮点数组?,python,numpy,Python,Numpy,我在numpy中有一个ndarray,它包含复杂的值。我想将每个值转换为两个浮点值。我用arrayreal和imag进行了尝试,但输出中只有real部分 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)]) 我

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

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

虚部在您的
输出数组中,但尺寸不符合您想要的顺序

尝试将最后一行替换为:

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)

虚部在您的
输出数组中,但尺寸不符合您想要的顺序

尝试将最后一行替换为:

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)

如果希望数据输出完全符合要求,则必须将数据类型转换为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)

如果希望数据输出完全符合要求,则必须将数据类型转换为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)

一种简单有效的方法是创建数组的
np.float32
视图,然后调整视图使其具有形状
(m,n,2)
,其中
(m,n)
inp\u数组的形状。通过使用视图,输出数组实际上使用了与
inp\u数组
相同的内存

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)
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\u数组

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)
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)
使用类型
np.float32
查看数组。如果
(m,n)
inp\u数组的形状
,则
v
将具有形状
(m,2*n)

现在重塑为
(m,n,2)
。(
w
就是你所说的
out\u数组

几点注意:

  • 此方法假定
    inp\u数组
    是“C连续的”。也就是说,数组中的数据以“C”顺序存储在连续的内存块中。例如,如果
    inp_数组
    被创建为更大数组的一部分,则情况可能并非如此
  • inp\u数组
    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)
    

    • 一种简单有效的方法是创建数组的
      np.float32
      视图,然后调整视图使其具有形状
      (m,n,2)
      ,其中
      (m,n)
      inp\u数组的形状。通过使用视图,输出数组实际上使用了与
      inp\u数组
      相同的内存

      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)
      
      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\u数组

      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)
      
      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)
      
      使用类型
      np.float32
      查看数组。如果
      (m,n)
      inp\u数组的形状
      ,则
      v
      将具有形状
      (m,2*n)

      现在重塑为
      (m,n,2)
      。(
      w
      就是你所说的
      out\u数组

      几点注意:

      • 此方法假定
        inp\u数组
        是“C连续的”。也就是说,数组中的数据以“C”顺序存储在连续的内存块中。例如,如果
        inp_数组
        被创建为更大数组的一部分,则情况可能并非如此
      • inp_数组
        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)