介绍普通数组是数组中存储的相同类型的对象。结构化数组是指在数组中存储不同对象的格式。今天我们将详细讨论NumPy中的结构化数组。结构化数组中的字段因为结构化数组包含不同类型的对象,所以每种对象类型都称为一个字段。每个字段有3个部分:字符串类型的名称、任何有效的dtype类型的类型和一个可选的标题。请参阅使用filed构建dtype的示例:在[165]中:np.dtype([('name','U10'),('age','i4'),('weight','f4')])Out[165]:dtype([('name','>>d=np.dtype([('x','i8'),('y','f4')])>>>d.names('x','y')>>>d.fieldsmappingproxy({'x':(dtype('int64'),0),'y':(dtype('float32'),8)})偏移和对齐对于结构化类型,由于一个dtype包含多种数据类型,这些数据类型默认是不对齐的。我们可以通过下面的例子来看看每种类型的偏移量:>>>defprint_offsets(d):...print("offsets:",[d.fields[name][1]fornameind.names])...print("itemsize:",d.itemsize)>>>print_offsets(np.dtype('u1,u1,i4,u1,i8,u2'))offsets:[0,1,2,6,7,15]itemsize:17如果在创建dtype类型时指定了align=True,那么这些类型可能会根据C-struct结构进行对齐。对齐的好处是可以提高加工效率。让我们看一个对齐示例:>>>print_offsets(np.dtype('u1,u1,i4,u1,i8,u2',align=True))offsets:[0,1,4,8,16,24]itemsize:32FieldTitles除了名字,每个Filed还可以包含标题。指定标题有两种方式,第一种方式:In[182]:np.dtype([(('mytitle','name'),'f4')])Out[182]:dtype([(('mytitle','name'),'>>x=np.array([(1,2,3),(4,5,6)],dtype='i8,f4,f8')>>>x[1]=(7,8,9)>>>xarray([(1,2.,3.),(7,8.,9.)],dtype=[('f0','>>x=np.zeros(2,dtype='i8,f4,?,S1')>>>x[:]=3>>>xarray([(3,3.,True,b'3'),(3,3.,True,b'3')],dtype=[('f0','>>x[:]=np.arange(2)>>>xarray([(0,0.,False,b'0'),(1,1.,True,b'1')],dtype=[('f0','>>twofield=np.zeros(2,dtype=[('A','i4'),('B','i4')])>>>onefield=np.zeros(2,dtype=[('A','i4')])>>>nostruct=np.zeros(2,dtype='i4')>>>nostruct[:]=twofieldTraceback(最近一次调用最后):...TypeError:无法从dtype([('A','>>a=np.zeros(3,dtype=[('a','i8'),('b','f4'),('c','S3')])>>>b=np.ones(3,dtype=[('x','f4'),('y','S3'),('z','O')])>>>b[:]=a>>>barray([(0.,b'0.0',b''),(0.,b'0.0',b''),(0.,b'0.0',b'')],dtype=[('x','>>x=np.array([(1,2),(3,4)],dtype=[('foo','i8'),('bar','f4')])>>>x['foo']array([1,3])>>>x['foo']=10>>>xarray([(10,2.),(10,4.)],dtype=[('foo','>>x=np.zeros((2,2),dtype=[('a',np.int32),('b',np.float64,(3,3))])>>>x['a'].shape(2,2)>>>x['b'].shape(2,2,3,3)除了单列访问,我们也可以一次访问多列数据:>>>a=np.zeros(3,dtype=[('a','i4'),('b','i4'),('c','f4')])>>>a[['a','c']]array([(0,0.),(0,0.),(0,0.)],dtype={'names':['a','c'],'formats':['>>a[['a','c']]=(2,3)>>>aarray([(2,0,3.),(2,0,3.),(2,0,3.)],dtype=[('a','>>a[['a','c']]=a[['c','a']]RecordArrays结构化数组只能通过索引访问,非常不方便。为此,NumPy提供了一个多维数组子类numpy.recarray,然后可以通过属性访问它。让我们看几个例子:>>>recordarr=np.rec.array([(1,2.,'Hello'),(2,3.,"World")],...dtype=[('foo','i4'),('bar','f4'),('baz','S10')])>>>记录。bararray([2.,3.],dtype=float32)>>>recordarr[1:2]rec.array([(2,3.,b'World')],dtype=[('foo','>>recordarr[1:2].fooarray([2],dtype=int32)>>>recordarr.foo[1:2]array([2],dtype=int32)>>>recordarr[1].bazb'World'recarray返回一个rec.array。除了使用np.rec.array创建,还可以使用view:In[190]:arr=np.array([(1,2.,'Hello'),(2,3.,"World")],...:...dtype=[('foo','i4'),('bar','f4'),('baz','a10')])...:In[191]:arrOut[191]:array([(1,2.,b'你好'),(2,3.,b'世界')],dtype=[('foo','>>recordarr=np.rec.array([('Hello',(1,2)),("World",(3,4))],...dtype=[('foo','S6'),('bar',[('A',int),('B',int)])])>>>type(recordarr.foo)>>>type(recordarr.bar)这篇文章已经收录在http://www.flydean.com/05-python-structured-arrays/最通俗的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!