将数字列表保存到(二进制)文件,每个数字定义位

时间:2017-07-27 15:28:16

标签: python numpy type-conversion byte bit

我有一个列表/数组,我想保存到二进制文件。 关键部分是,不应将每个数字保存为预定义的数据类型。 每个值的对于列表中的所有值都是常量,但不对应于典型的数据类型(例如byte或int)。

import numpy as np

# create 10 random numbers in range 0-63
values = np.int32(np.round(np.random.random(10)*63));

# each value requires exactly 6 bits
# how to save this to a file?

# just for debug/information: bit string representation
bitstring = "".join(map(lambda x: str(bin(x)[2:]).zfill(6), values));
print(bitstring)

在实际项目中,我想用给定的位dephts存储超过一百万个值。 我已经尝试过模块bitstring,但是将每个值附加到BitArray会花费很多时间......

2 个答案:

答案 0 :(得分:1)

可能是一些numpy特定的方式,使事情变得更容易,但这是一种纯Python(2.x)方式。它首先将值列表转换为单个整数,因为Python支持任意长度的int值。接下来,它将int值转换为字节字符串并将其写入文件。

注意:如果您确定所有值都符合指定的位宽,那么array_to_int()函数可以通过将其使用的(value & mask)更改为{{1}来略微加快}。

value

答案 1 :(得分:0)

由于您给出了一个字符串示例,我将假设您获得结果的方式。这意味着性能可能永远不会很好。如果可以,请尝试直接创建字节而不是通过字符串。

旁注:我正在使用Python 3,可能需要您对Python 2进行一些更改。我认为此代码应该直接在Python 2中工作,但是在字节数组和2到3之间的字符串,所以一定要检查。

byt = bytearray(len(bitstring)//8 + 1)
for i, b in enumerate(bitstring):
    byt[i//8] += (b=='1') << i%8

并获得回报:

bitret = ''
for b in byt:
    for i in range(8):
        bitret += str((b >> i) & 1)

对于数百万比特/字节,您需要将其转换为流式传输方法,否则您将需要大量内存。