打包numpy数组更好的方法?

时间:2015-07-09 02:34:38

标签: python numpy

我需要使用struct.pack打包一个numpy 2D数组,我正在寻找一种可以批量执行此操作的方法。我试过了:

X = numpy.array([[1,2,3],[4,5,6]])
b = struct.pack('=%sf' % X.size, *X)

但这不起作用。它提示: struct.error:打包预期6件包装(得2件)

是否有更好的方法来为每个元素打包numpy数组而不是循环?

3 个答案:

答案 0 :(得分:1)

看来' *'与struct.pack结合使用的运算符仅适用于1D数组。因此对于ND阵列,首先必须将其展平为1D。

X = numpy.array([[1,2,3],[4,5,6]])
b = struct.pack('=%sf' % X.size, *X.flatten('F'))

这适合我。

答案 1 :(得分:1)

*就像一个迭代器。迭代2d数组返回该数组的行。例如:

In [9]: def foo(*args):
    print(args)    
In [10]: foo(*np.ones((2,3)))
(array([ 1.,  1.,  1.]), array([ 1.,  1.,  1.]))
函数内部的

args是2个元组,每个元组都是一行。这就是为什么你的pack有两个项目,而不是6个(x.size)。当您展平数组时,*会生成所有6个项目。

In [11]: foo(*np.ones((2,3)).flat)
(1.0, 1.0, 1.0, 1.0, 1.0, 1.0)

但这个pack的目的是什么?

答案 2 :(得分:1)

如果您有一个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@'

如果您的数组是多维的,.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@'