将二进制文件读入复数数组

2024-06-26 18:01:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个二进制文件

16b-Real (little endian, 2s compliment)
16b-Imag (little endian, 2s compliment)
.....repeating

我需要把它转换成一维复数数组。不知道如何将“元组或列表”组合成一个值

import numpy as np
dtype = np.dtype([('i','<i2'), ('q','<i2')])
array = np.fromfile(data_file, dtype=dtype)
print(array)
el = array[0]
print(el)
print(type(el))

输出:

[(531, -660) (267, -801) (-36, -841) ... (835, -102) (750, -396)
 (567, -628)]
(531, -660)
<class 'numpy.void'>

期望输出:

[531-660j, 267-801j,...]

Tags: 文件numpynp二进制arrayrealelprint
2条回答

因此,您已将该文件加载为具有2个整型字段的结构化数组:

In [71]: dtype = np.dtype([('i','<i2'), ('q','<i2')])                                                        
In [72]: arr = np.array([(531, -660), (267, -801), (-36, -841), (835, -102), (750, -396)], dtype)            
In [73]: arr                                                                                                 
Out[73]: 
array([(531, -660), (267, -801), (-36, -841), (835, -102), (750, -396)],
      dtype=[('i', '<i2'), ('q', '<i2')])

我们可以用适当的1j乘法器将这两个字段相加,形成一个复杂的数组:

In [74]: x=arr['i']+1j*arr['q']                                                                              
In [75]: x                                                                                                   
Out[75]: array([531.-660.j, 267.-801.j, -36.-841.j, 835.-102.j, 750.-396.j])

如果我没弄错的话,numpy只实现浮点复数(64位和128位),所以可能已经经历了这个<i2阶段。你知道吗

在遍历元组列表时,可以将每个元组转换为complex数字

array = [(531, -660), (267, -801), (-36, -841) ,(835, -102) ,(750, -396), (567, -628)]

#Iterate over each element and convert it to complex
array = [complex(*item) for item in array]

print(array)
print(type(array[0]))

输出将是

[(531-660j), (267-801j), (-36-841j), (835-102j), (750-396j), (567-628j)]
<class 'complex'>

相关问题 更多 >