Python 如何将numpy复杂数组转换为两元素浮点数组?
我在numpy中有一个ndarray,它包含复杂的值。我想将每个值转换为两个浮点值。我用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)]) 我
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)