04_Numpy结构化数组
1 创建结构化数组
import numpy as np
类似C++的结构体,但更加强大,数组的每个元素可以包含多个字段,可以单独处理数组的每一个字段。
1.1 字典方式
dtype
的参数是一个字典:
names
:指定字段名称formats
:指定数据类型,可以使用Python类型或Numpy类型
my_dtype = {'names': ('name', 'age', 'weight'),'formats': ('U10', int, 'f8')
}
arr = np.zeros(4, dtype=my_dtype)
arr.dtype
dtype([('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])
1.2 列表元组方式
np.dtype([('name', 'U10'),('age', int),('weight', 'f8'),
])
dtype([('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])
如果类型名称不重要可以省略,仅仅指定数据类型。
np.dtype('U10, i8, f8')
dtype([('f0', '<U10'), ('f1', '<i8'), ('f2', '<f8')])
Numpy数据类型符号表:
符号 | 描述 | 示例 |
---|---|---|
‘b’ | 字节型 (Boolean or raw bytes) | np.dtype('b') |
‘i’ | 有符号整型 (Signed integer) | np.dtype('i4') == np.int32 |
‘u’ | 无符号整型 (Unsigned integer) | np.dtype('u1') == np.uint8 |
‘f’ | 浮点型 (Floating-point) | np.dtype('f8') == np.float64 |
‘c’ | 复数浮点型 (Complex floating-point) | np.dtype('c16') == np.complex128 |
‘S’, ‘a’ | 字节字符串 (Byte string) | np.dtype('S5') |
‘U’ | Unicode编码字符串 (Unicode string) | np.dtype('U') == np.str_ |
‘V’ | 原生数据 (Raw data, void) | np.dtype('V') == np.void |
2 访问结构化数组
数组的每一个字段依然是一个数组,可以用索引、聚合等操作。这里的操作有点像SQL,字段名像列,索引号像行。
# 创建结构化数组
arr = np.zeros(4, dtype={'names': ('name', 'age', 'weight'),'formats': ('U10', int, 'f8')
})arr['name'] = ['张三', '李四', '王五', '赵六']
arr['age'] = [18, 28, 20, 35]
arr['weight'] = [110.2, 125.3, 103.1, 159.6]
arr['name']
array(['张三', '李四', '王五', '赵六'], dtype='<U10')
# 访问操作
print('arr:', arr)print('\n通过字段名访问age列表:', arr['age'])
print('通过索引访问第一个元素:', arr[0])
print('组合字段和索引访问第一个人的名字:', arr[0]['name'], arr['name'][0])
arr: [('张三', 18, 110.2) ('李四', 28, 125.3) ('王五', 20, 103.1) ('赵六', 35, 159.6)]通过字段名访问age列表: [18 28 20 35]
通过索引访问第一个元素: ('张三', 18, 110.2)
组合字段和索引访问第一个人的名字: 张三 张三
结合布尔索引可以对元素进行筛选。
# 年龄小于25岁的人
print('年龄小于25岁的人的信息', arr[arr['age'] < 25])# 年龄小于25岁的人的姓名和年龄
print('年龄小于25岁的人的信息', arr[arr['age'] < 25][['name', 'age']])
年龄小于25岁的人的信息 [('张三', 18, 110.2) ('王五', 20, 103.1)]
年龄小于25岁的人的信息 [('张三', 18) ('王五', 20)]
结合描述统计方法对字段进行聚合。
# 计算平均年龄
print('平均年龄:', arr['age'].mean())
平均年龄: 25.25