我需要使用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数组而不是循环?
答案 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@'