一、结构化数组
1、结构化数组创建的意义
- ndarray是一种同构数据容器,想要用数组存储不同数据类型的时候会有很不方便,因此诞生了结构化数组
- 结构化数组提供将数组内单个数据解释为带有任意类型列的表格型结构
- 主要特点:
- 可以存储不同类型的数据(整数、浮点数、字符串等)
- 每个字段有名称和数据类型
- 支持类似数据库表格的操作
- 内存布局紧凑,访问高效
2、创建结构化数组
import numpy as np
dt = np.dtype([('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
data = np.array([('Alice', 25, 55.5), ('Bob', 32, 75.2)], dtype=dt)print(data)
"""
输出:
[('Alice', 25, 55.5) ('Bob', 32, 75.2)]
"""
data_dict = {'names': ['Alice', 'Bob', 'Charlie'],'ages': [25, 32, 37],'weights': [55.5, 75.2, 80.1]
}
dt = np.dtype([('names', 'U10'), ('ages', 'i4'), ('weights', 'f4')])
data = np.zeros(len(data_dict['names']), dtype=dt)
data['names'] = data_dict['names']
data['ages'] = data_dict['ages']
data['weights'] = data_dict['weights']print(data)persontype = np.dtype({'names':['name', 'age', 'chinese', 'math', 'english'],'formats':['S32','i', 'i', 'i', 'f']}
)
peoples = np.array([("ZhangFei",32,75,100,90),("GuanYu",24,85,96,88.5),("ZhaoYun",28,85,92,96.5), ("HuangZhong",29,65,85,100)],dtype=persontype)
ages = peoples[:]['age']
chineses = peoples[:]['chinese']
maths = peoples[:]['math']
englishs = peoples[:]['english'] print(peoples)
data = np.array([('Alice', 25, 55.5), ('Bob', 32, 75.2)],dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
3、访问结构化数组数据
print(data['name'])
print(data['age'])
print(data[0])
print(data[['name', 'age']])
"""
输出:
[('Alice', 25) ('Bob', 32)]
"""
4、字段操作
data['age'] = [26, 33]
data[1]['weight'] = 76.0
- 条件筛选(使用方法类似np.where的使用方法)
print(data[data['age'] > 30])
print(np.sort(data, order='age'))
print(np.sort(data, order=['age', 'weight']))
print(np.mean(data['age']))
new_dt = np.dtype(data.dtype.descr + [('height', 'f4')])
new_data = np.zeros(data.shape, dtype=new_dt)
for field in data.dtype.fields:new_data[field] = data[field]
new_data['height'] = [165.5, 180.2]
5、 结构化数组与普通数组的转换
- 结构化数组转普通数组(直接使用np.array进行转化)
numeric_data = np.array([data['age'], data['weight']]).T
- 普通数组转结构化数组(相当于创建结构化数组的方三)
arr = np.array([[1, 2.5, 'Alice'], [2, 3.7, 'Bob']])
dt = np.dtype([('id', 'i4'), ('value', 'f4'), ('name', 'U10')])
struct_arr = np.array([tuple(row) for row in arr], dtype=dt)
6、结构化数组的局限性
- 灵活性:不如 Pandas DataFrame 灵活
- 功能:缺乏高级数据操作功能(如分组、透视等)
- 性能:对于某些操作可能不如专门的数据结构高效
- 内存:字符串字段会占用固定长度的内存
二、Numpy 文件
1、保存到文件
- save(文件名,数组):保存数组到文件中,若未指定文件的后缀名自动保存为npy文件。
- savetxt(文件名,数组,其他限制条件):将文件保存到以txt为后缀的文件中
- savez(文件名,数组,数组):将多个文件保存到一个未压缩的文件中,数组以关键字的形式传入(关键字自定)
- savez_compressed(文件名,数组):将文件保存到一个已经压缩的文件中
import numpy as np
names = [ ('Tom', 18, 175), ('Jerry', 22, 180), ('Ben', 21, 170)]
dtype = [('name', 'S10'), ('age', int), ('height', float)]
data = np.array(names, dtype=dtype)
np.savetxt('data.csv', data, fmt='%s,%d,%.2f', header='name,age,height', comments='')
np.save('structured_data', data) np.savez("array_archive.npz", a=data, b=data) np.savez_compressed("array_archive.npz", a=data, b=data)
2、从文件加载
- loadtxt(文件名,使用savetxt时添加的限制条件):读取txt结尾的文件
- getfromtxt(文件名,限制条件):假如数组文件中有缺失的内容,该方法会将缺失的内容读成nan(nan代表浮点数据类型的数字)
- load(文件名):读文件的时候必须加上后缀
data = np.load('structured_data.npy')
print(data)
print(data["a"])
data = np.genfromtxt('data.csv', delimiter=',', dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')],skip_header=1)
print(data)
3、操作字节文件
- 操纵字节文件(多半和其余语言进行交互,这种文件可以是音频、视频等任何格式的文件)
- 此处的字节文件是一个二进制的字节流文件。
import wave
import numpy as npwf = wave.open('alert.wav')
data = wf.readframes(wf.getnframes())
data1 = np.frombuffer(data)
data1 = np.frombuffer(data, dtype='int64')