# Numpy 修炼之道 （10）—— 结构化数组

## 简介

```>>> x = np.array([('Bob', 18, 2000.0),('Tom', 23, 4000.0)],
... dtype=[('name', 'S10'), ('age', np.int_), ('incom', np.float_)])
>>> x
array([('Bob', 18,  2000.), ('Tom', 23,  4000.)],
dtype=[('name', 'S10'), ('age', '<i4'), ('incom', '<f8')])
>>> x.shape
(2L,)
>>> row = x[0]
>>> row
('Bob', 18,  2000.)
>>> col = x['name']
>>> col
array(['Bob', 'Tom'],
dtype='|S10')```

```>>> x['name'] = ['Bob01', 'Tom01']
>>> x
array([('Bob01', 18,  2000.), ('Tom01', 23,  4000.)],
dtype=[('name', 'S10'), ('age', '<i4'), ('incom', '<f8')])
>>> row
('Bob01', 18,  2000.)
>>> col
array(['Bob01', 'Tom01'],
dtype='|S10')```

## 构建结构化数组

```a) b1, i1, i2, i4, i8, u1, u2, u4, u8, f2, f4, f8, c8, c16, a<n>
(代表 bytes, ints, unsigned ints, floats, complex and
fixed length strings of specified byte lengths)b) int8,...,uint8,...,float16, float32, float64, complex64, complex128
(this time with bit sizes)c) older Numeric/numarray type specifications (e.g. Float32).
不推荐使用！d) Single character type specifiers (e.g H for unsigned short ints).
一般也避免使用！```

```>>> x = np.zeros(3, dtype='3int8, float32, (2,3)float64')
>>> x
array([([0, 0, 0],  0., [[ 0.,  0.,  0.], [ 0.,  0.,  0.]]),
([0, 0, 0],  0., [[ 0.,  0.,  0.], [ 0.,  0.,  0.]]),
([0, 0, 0],  0., [[ 0.,  0.,  0.], [ 0.,  0.,  0.]])],
dtype=[('f0', 'i1', (3,)), ('f1', '<f4'), ('f2', '<f8', (2, 3))])```

```>>> x = np.zeros(3, dtype=('i4',[('r','u1'), ('g','u1'), ('b','u1'), ('a','u1')]))
>>> x
array([0, 0, 0])
>>> x['r']
array([0, 0, 0], dtype=uint8)```

```>>> x = np.zeros(3, dtype=[('x','f4'),('y',np.float32),('value','f4',(2,2))])
>>> x
array([(0.0, 0.0, [[0.0, 0.0], [0.0, 0.0]]),
(0.0, 0.0, [[0.0, 0.0], [0.0, 0.0]]),
(0.0, 0.0, [[0.0, 0.0], [0.0, 0.0]])],
dtype=[('x', '>f4'), ('y', '>f4'), ('value', '>f4', (2, 2))])```

```>>> x = np.zeros(3, dtype={'names':['col1', 'col2'], 'formats':['i4','f4']})
>>> x
array([(0, 0.0), (0, 0.0), (0, 0.0)],
dtype=[('col1', '>i4'), ('col2', '>f4')])```

```>>> x = np.zeros(3, dtype={'col1':('i1',0,'title 1'), 'col2':('f4',1,'title 2')})
>>> x
array([(0, 0.0), (0, 0.0), (0, 0.0)],
dtype=[(('title 1', 'col1'), '|i1'), (('title 2', 'col2'), '>f4')])```

## 访问字段标题

```>>> x.dtype.fields['x'][2]
'title 1'```

## 访问和修改字段名称

```>>> x.dtype.names
('col1', 'col2')
>>>
>>> x.dtype.names = ('x', 'y')
>>> x
array([(0,  0.), (0,  0.), (0,  0.)],
dtype=[(('title 1', 'x'), 'i1'), (('title 2', 'y'), '<f4')])```

## 一次访问多个字段

```>>> x = np.array([(1.5,2.5,(1.0,2.0)),(3.,4.,(4.,5.)),(1.,3.,(2.,6.))],
dtype=[('x','f4'),('y',np.float32),('value','f4',(2,2))])```

```>>> x[['x','y']]
array([(1.5, 2.5), (3.0, 4.0), (1.0, 3.0)],
dtype=[('x', '<f4'), ('y', '<f4')])
>>> x[['x','value']]
array([(1.5, [[1.0, 2.0], [1.0, 2.0]]), (3.0, [[4.0, 5.0], [4.0, 5.0]]),
(1.0, [[2.0, 6.0], [2.0, 6.0]])],
dtype=[('x', '<f4'), ('value', '<f4', (2, 2))])
>>> x[x['y'] == 4]
array([( 3., 4., [[ 4., 5.], [ 4., 5.]])],
dtype=[('x', '<f4'), ('y', '<f4'), ('value', '<f4', (2, 2))])```

```>>> x[['y','x']]
array([(2.5, 1.5), (4.0, 3.0), (3.0, 1.0)],
dtype=[('y', '<f4'), ('x', '<f4')])```

## 记录数组

```>>> recordarr = np.rec.array([(1,2.,'Hello'),(2,3.,"World")],
...                    dtype=[('foo', 'i4'),('bar', 'f4'), ('baz', 'S10')])
>>> recordarr.bar
array([ 2.,  3.], dtype=float32)
>>> recordarr[1:2]
rec.array([(2, 3.0, 'World')],
dtype=[('foo', '<i4'), ('bar', '<f4'), ('baz', 'S10')])
>>> recordarr[1:2].foo
array([2], dtype=int32)
>>> recordarr.foo[1:2]
array([2], dtype=int32)
>>> recordarr[1].baz
'World'```

numpy.rec.array可以将各种参数转换为记录数组，包括正常的结构化数组：

```>>> arr = array([(1,2.,'Hello'),(2,3.,"World")],
...             dtype=[('foo', 'i4'), ('bar', 'f4'), ('baz', 'S10')])
>>> recordarr = np.rec.array(arr)```

131 篇文章48 人订阅

0 条评论

## 相关文章

### python基础----map和reduce

map和reduce Map简单来说就是：一个映射函数就是对一些独立元素组成的概念上的列表的每一个元素进行指定的操作 Reduce简单来说就是：对一个列表的...

21160

### Python 3.6.x字符串格式化方法小结

1 使用%符号进行格式 使用%符号进行字符串格式化的形式如下图所示，格式运算符%之前的部分为格式字符串，之后的部分为需要进行格式化的内容。 ? Python...

31660

### Python数据分析(3)-numpy中nd数组的创建

1、ndarray的内存结构 和其他的库一样，每个库都可能有自己独特的数据结构，例如OpenCV，numpy库的多维数组叫做ndarray（ N dimensi...

23780

22630

22870

203100

### printf()详解之终极无惑

printf()是C语言标准库函数，用于将格式化后的字符串输出到标准输出。标准输出，即标准输出文件，对应终端的屏幕。printf()申明于头文件stdio.h。

44130

17680

13120

### [程序设计语言]-[核心概念]-04:数据类型

0. 概述 为何高级语言需要类型系统这个概念？在汇编时代是没有完整的数据类型系统的，结构化编程引入了结构化的控制流、为结构化设计的子程序，随之这种结构化的代码所...

19860