在C/C++语言中,有结构体,结构体的使用给编程带来了很大的便利。Numpy作为Python的扩展模块,提供了对类似C/C++结构体的支持。Python定义结构体更为方便,如:
>>> import numpy as np >>> np.dtype({'names':['name','age','weight'], 'formats':['S1',np.uint8, np.float32]}) dtype([('name', 'S1'), ('age', 'u1'), ('weight', '<f4')]) >>>结构体的使用方法如下:
>>> arr = np.array([("Zhang",32,90),("Wang",23,92)],dtype = persontype) >>> arr array([(b'Z', 32, 90.0), (b'W', 23, 92.0)], dtype={'names':['name','age','weight'], 'formats':['S1','u1','<f4'], 'offsets':[0,1,4], 'itemsize':8, 'aligned':True}) >>>使用结构数组,首先创建一个dtype对象persontype,它的参数是一个描述结构类型的各个字段的字典。字典有两个键: “names”和“formats”。每个键对应一个列表。’names'定义结构中每个字段的名称,而'formats'则定义每个字段的类型。
>>> arr.dtype dtype({'names':['name','age','weight'], 'formats':['S12','u1','<f4'], 'offsets':[0,12,16], 'itemsize':20}, align=True)类型字符串前面的“|”、“<”和“>”等字符表示字段的字节顺序:
结构数组的存取方式和其他数组相同,如:
>>> arr[0]['name'] b'Zhang' >>> arr[0]['age'] =18 >>> arr array([(b'Zhang', 18, 90.0), (b'Wang', 23, 92.0)], dtype={'names':['name','age','weight'], 'formats':['S12','u1','<f4'], 'offsets':[0,12,16], 'itemsize':20, 'aligned':True}) >>>除此以外,还可以通过arr.tostring()或arr.tofile()方法将数组arr以二进制的方式转换为字符串或写入文件中,如:
arr.tofile("test.bin") #存到文件中可以通过C/C++对该文件进行读取,C语言的读取方式如下:
结构数组的内容就介绍到这里,注意在定义结构类型的时候的那个“align=True",该变量主要是使内存对齐,在数据写文件,跨语言访问的时候,内存对齐可以解决很多麻烦,建议在申明结构类型时都内存对齐。