我需要用 struct.pack 打包一个 numpy 2D 数组,我正在寻找一种可以批量执行此操作的方法。我试过:
X = numpy.array([[1,2,3],[4,5,6]])
b = struct.pack('=%sf' % X.size, *X)
Run Code Online (Sandbox Code Playgroud)
但这不起作用。它提示:
struct.error: pack expected 6 items for packing (got 2)
有没有更好的方法来打包 NumPy 数组而不是遍历每个元素?
如果你有一个 numpy 数组,你的数据已经打包在内存中,你不需要使用struct
:
>>> a = np.arange(1, 7)
>>> struct.pack('=6f', *a)
'\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@\x00\x00\xa0@\x00\x00\xc0@'
>>> a.astype('f').tostring()
'\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@\x00\x00\xa0@\x00\x00\xc0@'
Run Code Online (Sandbox Code Playgroud)
如果您的数组是多维的,.tostring
则默认采用扁平化视图:
>>> a = np.arange(1, 7).reshape(2, 3)
>>> a.astype('f').tostring()
'\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@\x00\x00\xa0@\x00\x00\xc0@'
Run Code Online (Sandbox Code Playgroud)
看来“*”运算符与 struct.pack 结合只适用于一维数组。因此对于ND阵列,首先必须将其展平为一维。
X = numpy.array([[1,2,3],[4,5,6]])
b = struct.pack('=%sf' % X.size, *X.flatten('F'))
Run Code Online (Sandbox Code Playgroud)
这对我有用。