Numpy复杂的数据结构

时间:2017-03-01 18:20:09

标签: python c numpy

我对python很新。我想要做的是从二进制文件中读取一些类似c的结构。创建它们的c程序中的结构定义为:

struct B{
    uint16 y;
    uint8 c[SIZE2];
}

struct A{
    uint32 x;
    struct B b[SIZE1];
}

我希望能够使用NumPy包函数fromFile读取所有A结构,但我不知道如何调用正确的dtype方法,如:

record = numpy.dtype([
    ("field1", numpy.uint8),
    ("field2", numpy.uint16),
    ("field3", numpy.uint32)
])

具有如此复杂的数据结构。

你可以帮我写一下吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个猜测,因为我没有太多使用C结构。

In [125]: SIZE1, SIZE2 = 3,4

In [127]: dtB=np.dtype([('y',np.uint16),('c',np.uint8,(SIZE2,))])
In [128]: np.ones((2,), dtype=dtB)
Out[128]: 
array([(1, [1, 1, 1, 1]), (1, [1, 1, 1, 1])], 
      dtype=[('y', '<u2'), ('c', 'u1', (4,))])
In [129]: _.itemsize
Out[129]: 6

在此定义中,此数组的每条记录由6个字节组成,2个用于y字段,4个用于c字段。

然后将其嵌套在A定义

In [130]: dtA=np.dtype([('x',np.uint32),('b',dtB,(SIZE1,))])
In [131]: np.ones((2,), dtype=dtA)
Out[131]: 
array([(1, [(1, [1, 1, 1, 1]), (1, [1, 1, 1, 1]), (1, [1, 1, 1, 1])]),
       (1, [(1, [1, 1, 1, 1]), (1, [1, 1, 1, 1]), (1, [1, 1, 1, 1])])], 
      dtype=[('x', '<u4'), ('b', [('y', '<u2'), ('c', 'u1', (4,))], (3,))])
In [132]: _.itemsize
Out[132]: 22

每个记录有4个字节用于x字段,3 * 6用于3个b元素。

In [133]: __.tobytes()
Out[133]: b'\x01\x00\x00\x00\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x00\x00\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01'

试图使阵列更有趣:

In [136]: A['x']=[1,2]
In [139]: A['b']['y'] *= 3
In [141]: A['b']['c'][0]=2
In [142]: A['b']['c'][1]=3
In [143]: A
Out[143]: 
array([(1, [(3, [2, 2, 2, 2]), (3, [2, 2, 2, 2]), (3, [2, 2, 2, 2])]),
       (2, [(3, [3, 3, 3, 3]), (3, [3, 3, 3, 3]), (3, [3, 3, 3, 3])])], 
      dtype=[('x', '<u4'), ('b', [('y', '<u2'), ('c', 'u1', (4,))], (3,))])
In [144]: A[0].tobytes()
Out[144]: b'\x01\x00\x00\x00\x03\x00\x02\x02\x02\x02\x03\x00\x02\x02\x02\x02\x03\x00\x02\x02\x02\x02'

这些字节串是否与您的c结构一致?