如何将4位数据加载到numpy数组中

6

我有一个包含8位复杂样本(即从最高位到最低位的虚部和实部(Q和I)各4位)的二进制数据文件。

我该如何将这些数据转换成numpy复数数组?

2个回答

7

没有支持进行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

这里有更多将两个实数数组转换为复数数组的方法: https://dev59.com/c3E85IYBdhLWcg3wzm9p#2598820
如果值是可能为负数的4位整数(即应用了二进制补码),可以使用算术位移来正确分离两个通道:
real = (np.bitwise_and(values, 0x0f) << 4).astype(np.int8) >> 4
imag = np.bitwise_and(values, 0xf0).astype(int) >> 4

“bitwise_and”操作实际上是不必要的。 “real = values << 4 >> 4”和“imag = values >> 4”可以正确处理符号和类型。 - Vincent

3
使用这个答案以每次读取一个字节的方式读取数据,这应该可以工作:
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

那么没有使用memmap或类似方法的方式可以实现吗? - Brian
2
那么,这样做是否更有效率呢:real = np.bitwise_and(a, 0x0f); imag = np.bitwise_and(a >> 4, 0x0f); 其中 a 是文件中的字节数组? - Brian
@B-Brock:是的,你的建议会更高效。 - Warren Weckesser
@B-Brock 当然。我只是想举一个更具有示范性的例子,而不是一些高级但快速的东西。但你绝对是正确的。 - Phonon
好的,谢谢您的回答!这暗示了我想知道的内容 :) - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接