2017-03-01 144 views
2

我對python很陌生。我想要做的是從二進制文件中讀取一些類似C的結構。該結構,在創建它們的C程序中,被定義爲:numpy複雜的數據結構

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) 
]) 

具有這樣複雜的數據結構。

你能幫我寫嗎?先謝謝你!

+0

你看了[這裏](https://docs.scipy.org/doc/numpy-1.10.1/user/basics.rec.html)?我不確定你是否可以像那樣嵌套,或者至少,我不知道如何嵌套。此外,也許[這個問題](http://stackoverflow.com/questions/9909399/nested-structured-numpy-array)是相關的,不知道。 –

回答

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結構是否一致?

+0

完美運作。謝謝! – neekogi