打包 numpy 数组的更好方法?

Jed*_*edi 5 python numpy

我需要用 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 数组而不是遍历每个元素?

Jai*_*ime 6

如果你有一个 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)


Jed*_*edi 2

看来“*”运算符与 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)

这对我有用。