这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
Numpy的结构化数组类似于Python中的class的概念,由一组具有具体含义的字段名和特定数据类型组成:
In [1]: import numpy as np
In [2]: data = np.array([('Mike', 18, 'SZ'), ('Jerry', 19, 'BJ')
...: ], dtype=[('name', 'U5'), ('age', 'i4'), ('city', 'U2')]
...: )
In [3]: data
Out[3]:
array([('Mike', 18, 'SZ'), ('Jerry', 19, 'BJ')],
dtype=[('name', '<U5'), ('age', '<i4'), ('city', '<U2')])
data是一个有两个元素长度为2的一维数组,每个元素有以下三个字段:
name: 长度小于等于5个字符的字符串
age: 长度为4个字节的整数
city: 长度小于等于2个字符的字符串
对于结构化数组的获取,既可以使用常规的整数索引进行获取数据,也可以直接根据字段名进行获取数据(效果就相当于获取excel中的某一列数据那样):
In [3]: data
Out[3]:
array([('Mike', 18, 'SZ'), ('Jerry', 19, 'BJ')],
dtype=[('name', '<U5'), ('age', '<i4'), ('city', '<U2')])
In [4]: data[0]
Out[4]: ('Mike', 18, 'SZ')
In [5]: data['city']
Out[5]: array(['SZ', 'BJ'], dtype='<U2')
In [6]: data['name']
Out[6]: array(['Mike', 'Jerry'], dtype='<U5')
In [7]: data['age']
Out[7]: array([18, 19], dtype=int32)
In [8]: data['city'][0]
Out[8]: 'SZ'
查看结构化数组的字段名信息:
In [10]: data.dtype
Out[10]: dtype([('name', '<U5'), ('age', '<i4'), ('city', '<U2')])
In [12]: data.dtype.names
Out[12]: ('name', 'age', 'city')
In [13]: data.dtype.fields
Out[13]:
mappingproxy({'name': (dtype('<U5'), 0),
'age': (dtype('int32'), 20),
'city': (dtype('<U2'), 24)})
dtype.names返回这个结构化数组的字段名列表;dtype.fields返回一个以字段名为key,字段数据类型和偏移量构成的元组作为key类似字典对象。
对结构化数据进行按字段名进行获取数据得到的是共享内存的视图,修改任意一个数组的数据都会影响到所有共享此内存的数组:
In [14]: names = data['name']
In [15]: names
Out[15]: array(['Mike', 'Jerry'], dtype='<U5')
In [16]: data
Out[16]:
array([('Mike', 18, 'SZ'), ('Jerry', 19, 'BJ')],
dtype=[('name', '<U5'), ('age', '<i4'), ('city', '<U2')])
In [17]: names[:] = 'Undefined'
In [18]: names
Out[18]: array(['Undef', 'Undef'], dtype='<U5')
In [19]: data
Out[19]:
array([('Undef', 18, 'SZ'), ('Undef', 19, 'BJ')],
dtype=[('name', '<U5'), ('age', '<i4'), ('city', '<U2')])