Python 在数据处理与科学计算相关的实践。如:
NumPy:Numerical Python,Python 科学计算基础库。pandas:[‘pændəz],基于 Numpy 开发,提供高性能、高级、易使用的数据结构与各种数据分析工具。SciPy:科学计算包: 解决线性代数、概率论、积分等任务的工具blaze:Python 数据值计算库,号称下一代的 Numpy
概述
- 基本操作:
- 数据导入:从文件、数据库、其他数据类型
- 数据处理:清理、整合、规范化、切片、切块、变形、转换、聚合等
- 建模:设计算法,构建模型
numpy
NumPy:Numerical Python,Python 科学计算基础库。
- 高性能处理大型多维数组,包含大量数组快速操作的 API,如数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。
- 特点:
- 高效:比 Python 基本数据结构要快
- 资源占用少:矩阵运算
- 基础:众多其他数据计算库依赖于它
- 数据类型适用于中间数据类型,如与 OpenCV、PyTorch 的数据类型的接口。
- 矩阵运算功能
- 矢量化:代码中没有任何显式的循环、索引等。
- 广播:各操作的隐式的逐元素行为
基本使用
1 | # 安装 |
ndarray 对象
ndarray:相同数据类型的 n 维数组
特点:相比于 list
- 创建时固定大小,变更大小会删原值创新值
- 元素数据类型相同
- 提前编译了其相关操作数据运算等操作,比 list 更快
创建
1 | # 转换 |
创建全黑图
1 | img_black=np.full((img_height,img_width),0) |
属性
设 axis=i ,则 numpy 沿着第 i 个下标变化的方向进行操作,
1 | a=np.array([1,2,3]) |
- a.ndim,即 shape 的长度
- 维度:
dimensions - 轴:
axis,NumPy 中的轴简单来说就是方向的意思,使用数字 0、1、2 表示,一维数组只有 0 轴,二维数组有 0、1 轴,三维数组有 0、1、2 轴, - 秩:
rank(轴的个数)
- 维度:
数据类型
1 | arr1 = np.array([1, 2, 3]) |
| 类型 | 描述 |
|---|---|
| int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
| intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
| intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
| int8 | 字节(-128 to 127) |
| int16 | 整数(-32768 to 32767) |
| int32 | 整数(-2147483648 to 2147483647) |
| int64 | 整数(-9223372036854775808 to 9223372036854775807) |
| uint8 | 无符号整数(0 to 255),构建 RGB 图像常用 |
| uint16 | 无符号整数(0 to 65535) |
| uint32 | 无符号整数(0 to 4294967295) |
| uint64 | 无符号整数(0 to 18446744073709551615) |
| bool_ | 布尔型数据类型(True 或者 False) |
| float_ | float64 类型的简写 |
| float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
| float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
| float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
| complex_ | complex128 类型的简写,即 128 位复数 |
| complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
| complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
基本操作
数学运算
1 | np.abs(x) # 绝对值 |
索引切片
1 | a=np.arange(1,6) |
统计
1 | # 标准差 |
复制与视图
arr.view():视图(浅复制)只是原有数据的一个引用,通过该引用可访问、操作原有数据,如果我们对视图进行修改,它会影响原始数据,因为浅复制共享内存。- 切片会返回一个视图,不再需要原始数组时,应在切片后使用
copy arr.copy():副本(深复制)是对数据的完整拷贝,如果我们对副本进行修改,它不会影响到原始数据,因为深复制不共享内存。
1 | a=np.arange(4) |
映射函数
1 | # 可针对某个轴的方向进行函数操作 |
添加
1 | import numpy as np |
组合与拆分
1 | a=np.arange(6).reshape(2,3) |
删除与插入
1 |
|
更改形状
1 | a=np.arange(24).reshape(2,3,4) |
排序
1 | a.sort() |
选择
- 输入输出
- 离散傅立叶变换
- 线性代数
- 统计运算
- 随机模拟
1 | import numpy as np |
随机数
随机种子:确定随机种子,即确定随机数的起点:随机数是一长序列,设定随机种子,相当于设定了序列的起点,后面生成的随机数相同
1 | np.random.seed(0) # 确定随机种子,即随机数的起点 |
广播 Broadcasting
- broadcast 提供了一种向量化阵列的操作方式,因而减少了循环,通常执行效率非常高。然而,有时可能会导致内存浪费以致计算减慢。
- Numpy 的 Universal functions 中要求输入的数组 shape 是一致的,当数组的 shape 不想等的时候,则会使用广播机制,调整数组使得 shape 一样,满足规则,则可以运算,否则就出错。
1 | a = np.array([1.0, 2.0) |
解线性方程组
1 | A = np.mat("1 -2 1;0 2 -8;-4 5 9") # 矩阵 |
linalg
linear(线性)+algebra(代数),
1 | np.linalg.inv(a) |
遇到的问题
- 问题:Opencv的两像素相减,不会出现负值,而是都在[0-255]之间
- 解决方案:
1 | imgs_train[1][:,:,1].astype(np.float32)-imgs_train[1][:,:,2].astype(np.float32) |
pandas
pandas:[‘pændəz],基于 Numpy 开发,提供高性能、高级、易使用的数据结构与各种数据分析工具。
- 特点:
- 突破:只要内存够大,可以完全代替 SQL。
- 相比于 numpy 的列表式数据,pandas 的字典式数据更好操作
- 将复杂的数据操作转换为一两条命令
- 可作为数据库框架使用
- 开源:BSD 协议
- 高效:快速、灵活、明确
- 参考资料
- 功能
- 进行 dataframe 处理
- 合并、去重、转换、汇总、分组
- 适用于处理以下类型的数据:
- 有序和无序的时间序列数据
- 带行列标签的矩阵数据,包括同构或异构型数据
- 与 SQL 或 Excel 表类似的,含异构列的表格数据
- 任意其它形式的观测、统计数据集,数据转入 Pandas 数据结构时不必事先标记
- 劝退:
- pandas 加一行数据,万级的数据量,无论是用 loc 还是 concat,都是秒级,append,是毫秒级;pandas、又重又慢
1 | df.loc[0]={'a':1,'b':2} |
名词解释
column:列
row:行
数据结构
pd.Series:pandas 数组(列表),均匀数据的一维数组
pd.date_range:创建 pandas 日期列表
1 | import pandas as pd |
1 | # 属性 |
pd.DataFrame
pd.DataFrame:pandas 矩阵,异构数据的二维数组,Series 的容器
1 | # 创建 |
属性
1 | df.info() # 基本信息,维度,列名称,数据格式,空间 |
操作
1 | # 查 |
pd.Panel
pd.Panel: 面板,异构数据的三维数组,DataFrame 的容器
pd.Panel4D:四维数组pd.PanelND…更多维数组
数据类型
- float:float64:浮点数字
- 浮点数默认类型
- int:int64:整型数字
- 整数默认类型
- bool:True/False
- datetime64:日期时间
- timedelta64:时间差
- category:枚举
- object:文本或混合数字
- 文字默认类型
- string
1 | # DatetimeTZDtype |
基本操作
基本配置
1 | import pandas as pd |
数据加载与导出
- 读写 excel 需要 xlrd 与 xlwriter 模块
1 | # 读入 |
数据提取
- loc 函数按标签值进行提取
- iloc 按位置进行提取
- ix 可以同时按标签和位置进行提取。
1 | data_df # 选择所有 |
数据处理
1 | df1.sort_index(axis=1,ascending=False) |
数据清洗
重命名
1 | # 列名 |
1 | df=df.fillna(value=0) # 空值填 0 |
1 | dates = pd.date_range('20180709', periods=3) |
数据清洗
1 | # 合并 |
HDF5
HDF5:Hierarchical Data Format:高效存储和分发科学数据的新型数据格式
- 特点:
- 自述性:文件内的每个数据对象都有元数据
- 数据对象 = 数据描述符 + 数据元素
- 数据描述符:12 字节长,包含了数据元素的类型、位置、尺度等信息
- 数据元素:数据部分
- 数据对象 = 数据描述符 + 数据元素
- 通用性:兼容各种数据类型
- 灵活性:相关数据可组合,放到一个分层结构,向数据对象添加描述和标签
- 扩展性:易增加新的数据模式、与其他标准格式兼容
- 跨平台:与平台无关
- 自述性:文件内的每个数据对象都有元数据
- 文件构成:基本数据对象
- group:包含 0 个或多个 HDF5 对象且支持元数据(metadata)的一个群组结构
- dataset:数据元素的一个多维数组及支持元数据(metadata)
- 数据类型:
- 栅格图象: 数据模式提供一种灵活方式存储、描述栅格图象数据,包括 8bit 栅格图象。
- 调色板: 也叫作彩色查对表,它提供图像的色谱。
- 科学数据集: 用来存储和描述多维科学数据陈列。
- Vdata: 是一个框架,用于存储和描述数据表。
- HDF 注释: 是文字串,用来描述 HDF 文件或 HDF 数据目标。
- Vgroup: 是用来把相关数据目标联系起来。一个 Vgroup 可以含有其它 Vgroup,以及数据目标。任一个 HDF 目标均可以包括进某个 Vgroup 中。
- 性能:
在写出同样大小的数据框上,HDF5比常规的csv快了将近50倍,andcsv比HDF5多占用将近一倍的空间,这还是在我们没有开启HDF5压缩的情况下
1 | # 类似dict的对象,使用PyTables库以高性能的HDF5格式来读写pandas对象 |
1 | import numpy as np |
Scipy
SciPy:科学计算包: 解决线性代数、概率论、积分等任务的工具
fortran 数值计算库
- SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。其功能与软件 MATLAB、Scilab 和 GNU Octave 类似。
- 线性代数使用 lapack 库
- fftpack 库:快速傅里叶变换
- odepack 库:常微分方程求解
- minpack 库:非线性方程组求解及最小值求解。
1 | # 数值积分例程和微分方程求解器 |
blaze
blaze:Python 数据值计算库,号称下一代的 Numpy
- 用于处理分布式的各种不同数据源的计算
shapely
shapely:操作和分析笛卡尔坐标系中的几何对象,使用GEOS库中的函数进行矢量数据构建与分析
#最佳实践
- Shapely 实现没有 平滑(即具有连续切线)曲线。所有曲线必须 由线性样条近似
- 各种几何对象的属性
- 面积:area:float
- 边界:bounds:float的
(minx,miny,maxx,maxy) - 长度:length:float
- 返回可移动节点以产生无效几何图形的最小距离:minium_clearance
- 不存在则返回 math.infinity
- 类型:geom_type:str
- 距离:obj.distance(other):到另一个几何对象的最小距离
- hausdorff距离:obj.hausdorff_distance(other):最远距离
- representative点:obj.representative_point():返回
- 不是质心(centroid)
- 转换为wkt格式:obj.wkt
- 是否为空:obj.is_empty
- 是否包含Z坐标:obj.has_z
- 是否是有效对象:obj.is_valid
- 对像的小最小凸多边形:obj.convex_hull
- 对象的最小矩形:obj.envelope
- 对象的最小外接矩形:obj.minimum_rotated_rectangle
- 对象左侧或右侧的一个LineString或MultiLineString:obj.parallel_offset(distance,side,resolution=16,join_style=1,mitre_limit=5.0)
- 点的处理:
- 获取点的坐标:
point.coords[:]
- 获取点的坐标:
实体类
点-Point
- 点的集合:
MultiPoint类- list(points.geoms):访问点集合的成员
线-LineString
- 线的集合:
MultiLineString类 - 坐标:line.coords
- 是否为闭环:line.is_ring
- 是否是简单的:line.is_simple
线性环:LinearRing
线性环不能交叉,也不能相互接触 在一个点上
- 坐标:ring.coords
- 坐标是否为逆时针:ring.is_ccw
- 是否为闭环:ring.is_ring
多边形-Polygon-曲面
- 曲面的集合:
MultiPolygon - 获取多边形的外环坐标:polygon.exterior.coords
- 即多边形上的点:
points = list(polygon.exterior.coords)
- 即多边形上的点:
- 获取多边形的内环:polygon.interiors
1 |
|
矩形多边形-box
- 默认为逆时针顺序
1 | from shapely import box |
集合
- 获取集合中各对象的类型:
- collection.geoms
- list(collection.geoms)
- len(collection.geoms)
- 除collection类型为,其它集合类型如Multipoint、MultiLineString、MulitPolygon也支持这些操作。
关系
- 包含
- 相交
- 重叠
操作
获取两个对象的关系
- 是否完全相同:类型和坐标都相同:
object.__eq__(other) - 是否相同:边界、interior和exterior相同:
object.equals(other) - 是否近似相同:
object.almost_equals(other[, decimal=6]) - 是否包含:
object.contains(other) - 是否反向包含:
object.within(other) - 是否交叉:object.crosses(other)
- 是否反向交叉:object.disjoint(other)
- 是否交叉:object.intersects(other)
- 是否覆盖:object.overlaps(other)
- 是否接触:object.touches(other)
创建新的对象
- 差集:object.difference(other)
- 交集:object.intersection(other)
- 对称差集:object.symmetric_difference(other)
- 并集:object.union(other)
Polars
polars:Polars 是一个用于处理结构化数据的极速 DataFrame 库。其核心用 Rust 编写,并提供 Python、R 和 NodeJS 接口。
- 特点:
- 快速:完全用 Rust 从头编写,设计贴近底层机器,无外部依赖。
- I/O (输入/输出):对所有常见数据存储层提供一流支持:本地、云存储和数据库。
- 直观的 API:以您预期的方式编写查询。Polars 会利用其查询优化器在内部确定最有效的执行方式。
- 核外处理:流式 API 允许您处理结果,而无需将所有数据同时加载到内存中。
- 并行:通过在可用 CPU 核心之间分配工作负载,充分利用您机器的性能,无需额外配置。
- 向量化查询引擎
- GPU 支持:可选地在 NVIDIA GPU 上运行查询,以在内存工作负载中实现最大性能。
- Apache Arrow 支持:Polars 可以消费和生成 Arrow 数据,通常进行零拷贝操作。请注意,Polars 不是基于 Pyarrow/Arrow 实现构建的。相反,Polars 有自己的计算和缓冲区实现。
- 理念:目标是提供一个闪电般快速的 DataFrame 库
- 利用您机器上的所有可用核心。
- 优化查询以减少不必要的工作/内存分配。
- 处理远大于可用 RAM 的数据集。
- 提供一致且可预测的 API。
- 遵循严格的模式(数据类型在运行查询前应已知)。
- 支持:
- Polars 支持常见文件格式(例如 CSV、JSON、Parquet)、云存储(S3、Azure Blob、BigQuery)和数据库(例如 PostgreSQL、MySQL)的读写。
