使用 Python 将数据压缩成例如12 位块?
Using Python to compress data into e.g. 12-bit chunks?
我有一种数据类型,输出为 0 到 4095 范围内的约 2800 万个整数(从技术上讲,它是硬件输出的带符号的 16 位整数,范围从 0 到 (1/2) * 2 ^16,但这种表示不必要地精确)。因此,原则上每个数据点的值都可以用 12 位表示——一个字节和一个字节,如果你愿意的话。从长远来看,我正在处理中等数量的数据(两位数的太字节),我打算将其存储为二进制文件,因此显然欢迎将其无损压缩到其大小的 75%。
显然我可以编写一个函数将我的数据编码为布尔值并返回并使用 Numpy 的二进制处理函数进行解析。但是,我必须在存储和检索的 ease/speed 之间取得平衡。因此我想知道是否有任何现有的包、算法等以简单有效的方式实现这一点。如果需要,我可以使用 Fortran 或 C,所以可以选择在其中制作模块,但如果我不这样做,我的同事会更喜欢。
你试过gzip.compress()
了吗? https://docs.python.org/3/library/gzip.html
它并不专门用于您正在执行的特定任务,但如果您有像一系列字节一样简单的东西,其中位的子集始终为零,我希望 gzip
能够处理这与专门的压缩算法差不多,并且它具有成为其他工具读取没有问题的通用格式的好处。
可不可以package/bit-shift将两个12位的整数组成一个三字节(24位)的数组,然后通过位移得到高12位和低12位?
我想这样的编码也可以很好地压缩,除了 space 编码节省之外,考虑到冗余,或者如果您的数据特别稀疏或整数以某种方式分布。
我对 numpy
了解不多,但粗略地看一下,我相信它可以存储字节数组,并且 Python 中有可用的位移位操作数。如果性能是一项要求,可以查看 Cython 以在 Python 中的 unsigned char *
上进行基于 C 的位操作。
您需要计算出偏移量,以便始终获得正确的起始字节,否则您会得到类似于“frameshift mutation”的东西,以使用生物学比喻。这对于 TB 大小的数据容器来说可能是个坏消息。
我有一种数据类型,输出为 0 到 4095 范围内的约 2800 万个整数(从技术上讲,它是硬件输出的带符号的 16 位整数,范围从 0 到 (1/2) * 2 ^16,但这种表示不必要地精确)。因此,原则上每个数据点的值都可以用 12 位表示——一个字节和一个字节,如果你愿意的话。从长远来看,我正在处理中等数量的数据(两位数的太字节),我打算将其存储为二进制文件,因此显然欢迎将其无损压缩到其大小的 75%。
显然我可以编写一个函数将我的数据编码为布尔值并返回并使用 Numpy 的二进制处理函数进行解析。但是,我必须在存储和检索的 ease/speed 之间取得平衡。因此我想知道是否有任何现有的包、算法等以简单有效的方式实现这一点。如果需要,我可以使用 Fortran 或 C,所以可以选择在其中制作模块,但如果我不这样做,我的同事会更喜欢。
你试过gzip.compress()
了吗? https://docs.python.org/3/library/gzip.html
它并不专门用于您正在执行的特定任务,但如果您有像一系列字节一样简单的东西,其中位的子集始终为零,我希望 gzip
能够处理这与专门的压缩算法差不多,并且它具有成为其他工具读取没有问题的通用格式的好处。
可不可以package/bit-shift将两个12位的整数组成一个三字节(24位)的数组,然后通过位移得到高12位和低12位?
我想这样的编码也可以很好地压缩,除了 space 编码节省之外,考虑到冗余,或者如果您的数据特别稀疏或整数以某种方式分布。
我对 numpy
了解不多,但粗略地看一下,我相信它可以存储字节数组,并且 Python 中有可用的位移位操作数。如果性能是一项要求,可以查看 Cython 以在 Python 中的 unsigned char *
上进行基于 C 的位操作。
您需要计算出偏移量,以便始终获得正确的起始字节,否则您会得到类似于“frameshift mutation”的东西,以使用生物学比喻。这对于 TB 大小的数据容器来说可能是个坏消息。