Python数据分析系列之Numpy常用操作第八篇

307 阅读2分钟

这是我参与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')])