在Python中组合打包标头和numpy数组

时间:2013-07-15 15:18:44

标签: python numpy

是否有人提供有关如何打包标题然后将其附加到某些数据块的提示?

例如,如果我有一个16位字节的比特打包头,然后我想将它附加到大约2MB的原始RGB图像,那么最有效的方法是什么?

到目前为止,我已经尝试了以下

headerVals = ( str(headerVersion), str(formatEnum), frameCount, ntpTimestamp, width, height )
packedHdr = self.imgStruct.pack( *headerVals )

return packedHdr + data

然而,由于str和numpy数组不可连接,因此失败并出现以下错误:

    return packedHdr + data
TypeError: cannot concatenate 'str' and 'numpy.ndarray' objects

作为Python初学者,我能想到的唯一解决方法就是以下因为显而易见的原因而非常慢:

# Generate the header
headerVals = ( str(headerVersion), str(formatEnum), frameCount, ntpTimestamp, width, height )

packDir = 'cchqhh{0}h'.format(width*height*3)

return pack( packDir, str(headerVersion), str(formatEnum), frameCount, ntpTimestamp, width, height, *data )

有什么想法吗?作为一名Python初学者,我发现自己有点难过!

更新:

根据下面的建议,我将我的代码更新为以下内容,并且它运行良好。

# Generate the header
headerVals = ( str(headerVersion), str(formatEnum), frameCount, ntpTimestamp, width, height )
packedHdr = self.imgStruct.pack( *headerVals )

# Concatanate header to the data
return numpy.concatenate( ( numpy.fromstring( packedHdr, dtype=numpy.uint8 ), data ), axis=0 )

2 个答案:

答案 0 :(得分:1)

要将标头与numpy数组连接起来,您需要以二进制形式提供数组。假设data是一个int数组:

import struct

raw_data = packedHdr + struct.pack('i' * data.size, *data)

如果您的数据属于其他类型,则需要在st.pack中指定。然后,您可以以所需的格式解压缩生成的raw_data

答案 1 :(得分:0)

为什么不将headerVersionformatEnum放在一个numpy数组中,然后尝试连接?