Python 如何将4位数据加载到numpy阵列中

Python 如何将4位数据加载到numpy阵列中,python,arrays,numpy,complex-numbers,Python,Arrays,Numpy,Complex Numbers,我有一个二进制数据文件,其中包含8位复杂样本,即从MSB到LSB的虚部和实部(Q和I)的4位和4位样本 如何将这些数据放入一个numpy复数数组?使用一次读取一个字节的数据,应该可以: with open("myfile", "rb") as f: byte = f.read(1) while byte != "": # Do stuff with byte. byte = f.read(1) real = byte >>

我有一个二进制数据文件,其中包含8位复杂样本,即从MSB到LSB的虚部和实部(Q和I)的4位和4位样本

如何将这些数据放入一个numpy复数数组?

使用一次读取一个字节的数据,应该可以:

with open("myfile", "rb") as f:
    byte = f.read(1)
    while byte != "":
        # Do stuff with byte.
        byte = f.read(1)
        real = byte >> 4
        imag = byte & 0xF
        # Store numbers however you like

不支持8位复数(4位实数,4位虚数)。 因此,下面的方法是一种很好的方法,可以有效地将它们读入单独的numpy数组,用于复数和虚数组

values = np.fromfile("filepath", dtype=int8)
real = np.bitwise_and(values, 0x0f)
imag = np.bitwise_and(values >> 4, 0x0f)
如果你想要一个复杂的数组

signal = real + 1j * imag
这里有更多将两个实数组转换为复杂数组的方法:


如果值为4位整数,可能为负数(即2的补码适用),则可以使用算术位移位正确分离两个通道:

real = (np.bitwise_and(values, 0x0f) << 4).astype(np.int8) >> 4
imag = np.bitwise_and(values, 0xf0).astype(int) >> 4
real=(np.按位_和(值,0x0f)>4
imag=np.按位_和(值,0xf0).astype(int)>>4

所以用memmap或类似的东西是没有办法做到的?那么这样做会不会更有效:
real=np.bitwise_和(a,0x0f);imag=np.bitwise_和(a>>4,0x0f)
其中
a
是文件中的字节数组?@B-Brock:是的,你的建议会更有效率。@B-Brock肯定是的。我想要的是一个更具说明性的示例,而不是一些高级但快速的示例。但你肯定是正确的。好的,谢谢你的输入!-这暗示了我想知道的:)实际上,
按位_和
操作是不必要的
real=values>4
imag=values>>4
正确处理符号和键入。