Python NumPy 库基础

NumPy 是 Python 语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数函数库。
Reference:【MOOC】Python 数据分析与展示 - 北京理工大学 -【第一周】数据分析之表示 ; 公开课 ;Document;GitHub

数据的维度

  1. 一维数据
    一维数据由对等关系的有序或无序数据构成,采用线性方式组织,对应列表、数组和集合等概念。
    列表和数组的区别是:

    • 列表中元素的数据类型可以不同。
    • 数组中元素的数据类型相同。
      一维数据的 Python 表示:列表(有序)或者集合(无序)。
  2. 二维数据
    二维数据由多个一维数据构成,是一维数据的组合形式,表格是典型的二维数据,其中,表头是二维数据的一部分。
    二维数据的 Python 表示:列表。

  3. 多维数据
    多维数据由一维或二维数据在新维度上扩展形成。
    多维数据的 Python 表示:列表。

  4. 高维数据
    高维数据仅利用最基本的二元关系展示数据间的复杂结构。
    高维数据的 Python 表示:字典类型或者 JSON、XML、YAML 格式。

NumPy 的数组对象:ndarray

NumPy 是一个开源的 Python 科学计算基础库,包含:
- 一个强大的 N 维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
NumPy 是 SciPy、 Pandas 等数据处理或科学计算库的基础。
一般使用 import numpy as np 来引用 numpy 库。
ndarray 意为:N 维数组对象。

ndarray 的好处

  • 数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据。
  • 设置专门的数组对象,经过优化,可以提升这类应用的运算速度。
    注:科学计算中,一个维度所有数据的类型往往相同。
  • 数组对象采用相同的数据类型,有助于节省运算和存储空间。

ndarray 由两部分构成

  • 实际的数据
  • 描述这些数据的元数据(数据维度、数据类型等)

ndarray 数组一般要求所有元素类型相同(同质),数组下标从 0 开始。
ndarray 在程序中的别名是 array,所以用 np.array () 生成一个 ndarray 数组。
np.array() 输出成 [] 格式,元素由空格分割。
轴(axis)保存数据的维度;秩(rank)轴的数量。

ndarray 对象的属性

属性 说明
.ndim 秩,即轴的数量或维度的数量
.shape ndarray 对象的尺度,对于矩阵:n 行 m 列
.size ndarray 对象元素的个数,即 n*m 的值
.dtype ndarray 对象的元素类型
.itemsize ndarray 对象中每个元素的大小,以字节为单位
如果元素均为整数,则缺省为 int32,如果元素中有浮点数,则缺省为 float64。

ndarray 数组的元素类型

数据类型 说明
bool 布尔类型,True 或者 False。
intc 与 C 语言的 int 类型一致,一般是 int32 或者 int64
intp 用于索引的整数,与 C 预言中的 ssize_t 一致,int32 或者 int64
int8 字节长度的整数,取值:[-128, 127]
int16 16 位长度的整数,取值:[-32768, 32767]
int32 32 位长度的整数,取值:[-231, 231-1]
int64 64 位长度的整数,取值:[-263, 263-1]
uint8 8 位无符号整数,取值:[0, 255]
uint16 16 位无符号整数,取值:[0, 65535]
uint32 32 位无符号整数,取值:[0, 232-1]
uint64 64 位无符号整数,取值:[0, 264-1]
float16 16 位半精度浮点数:1 位符号位,5 位指数,10 位尾数
float32 32 位半精度浮点数:1 位符号位,8 位指数,23 位尾数
float64 64 位半精度浮点数:1 位符号位,11 位指数,52 位尾数
complex64 复数类型,实部和虚部都是 32 位浮点数
complex128 复数类型,实部和虚部都是 64 位浮点数

浮点数:(符号)尾数 * 10 指数
复数:实部 (.real)+ 虚部 i(.imag)

与 Python 对比

  • Python 语法仅支持整数、浮点数和复数 3 种类型。
  • 科学计算涉及数据较多,对存储和性能都有较高要求。
  • 对元素类型精细定义,有助于 NumPy 合理使用存储空间并优化性能。
  • 对元素类型精细定义,有助于程序员对程序规模有合理评估。

非同质的 ndarray 对象

ndarray 数组可以由非同质的对象构成。
非同质的 ndarray 元素类型为 object 类型。

ndarray 数组的创建

ndarray 数组的创建方法

  1. 从 Python 中的列表、元组、列表元祖混合等类型创建 ndarray 数组:
    np.array(list,tuple)
  2. 从字节流(raw bytes)中创建 ndarray 数组。
  3. 从文件中读取特定格式中创建 ndarray 数组。
  4. 使用 NumPy 中函数创建 ndarray 数组:
函数 说明
np.arange(n,m,k) 类似 range() 函数,返回 ndarray 类型,元素从 n 到 m-k,间隔 k
np.ones(shape) 根据 shape 生成一个全 1 数组,shape 是元组类型
np.zeros(shape) 根据 shape 生成一个全 0 数组,shape 是元组类型
np.full(shape,val) 根据 shape 生成一个数组,shape 是元组类型,每个元素的值都是 val
np.eye(n) 创建一个正方的 n*n 单位矩阵,对角线为 1,其余为 0
np.ones_like(a) 根据数组 a 的形状生成一个全 1 数组
np.zero_like(a) 根据数组 a 的形状生成一个全 0 数组
np.full_like(a,val) 根据数组 a 的形状生成一个全 1 数组
np.linspace(n,m,k) 根据起止数据等间距地填充数据,形成数据,元素从 n 到 m,间隔 (m-n)/(k-1),元素个数为 k
np.linspace(n,m,k,endpoint=False) 根据起止数据等间距地填充数据,形成数据,元素从 n 到 m-(m-n)/k,间隔 (m-n)/k,元素个数为 k
np.linspace(a,b,c,...) 将两个或者多个数组合并成一个新的数组,原数组不变

np.array() 不指定 dtype 时,NumPy 将根据数据情况关联一个 dtype 类型。

ndarray 数组的变换

对于创建后的 ndarray 数组,可以对其进行维度变换和元素类型变换。
维度变换:

方法 说明
.reshape(shape) 不改变数组元素,返回一个 shape 形状的新数组,原数组不变
.resize(shape) .reshape(shape) 功能一致,但修改原数组
.swapaxes(ax1,ax2) 将数组的其中两个维度进行顺序调换
.flatten() 对数组进行降维,返回折叠后的新的一维数组,原数组不变
.astype(new_type) 对数组中的元素进行类型变化,返回一个新数组,原数组不变
.tolist() ndarray 数组向列表转换

ndarray 数组的操作

数组的索引和切片:
- 索引:获取数组中特定位置元素的过程。
- 切片:获取数组元素子集的过程。

  1. 一维数组的索引和切片:与 Python 的列表类似
    • a[n]:返回第 n+1 个元素。如果 n 为负数,则返回倒着数第 n 个元素。
    • a[n:m:k]:起始编号 n,终止编号 m,步长 k,用冒号分割。如果 n 为空,即 n = 0;如果 m 为空,即 m = len(a)
  2. 多维数组的索引和切片:
    • a[n,m,k,...]:每个维度一个索引值,最外 list 中第 n 个元素,倒数第二外 list 中第 m 个元素,以此类推。如果 n 为负数,则返回倒着数第 n 个元素。
    • a[n1:m1:k1,n2:m2:k2,n3:m3:k3,...]:每个维度的切片方法与一维数组相同。顺序为从外到内。

ndarray 数组的运算

数组与标量之间的运算作用于数组的每一个元素。

NumPy 一元函数

对 ndarray 中的数据执行元素级运算的函数:

函数 说明
np.abs(x) or np.fabs(x) 计算数组各元素的绝对值
np.sqrt(x) 计算数组各元素的平方根
np.sqare(x) 计算数组各元素的平方
np.log(x) or np.log10(x)ornp.log2(x) 计算数组各元素的自然对数、10 为底的对数、2 为底的对数
np.ceil(x) or np.floor(x) 计算数组各元素的向上取整、向下取整
np.rint(x) 计算数组各元素的四舍五入
np.modf(x) 将数组各元素的小数部分和整数部分以两个独立数组形式返回
np.cos(x) or np.cosh(x)
np.cos(x) or np.cosh(x)
np.cos(x) or np.cosh(x)
计算数组各元素的普通型和双曲型三角函数
np.exp(x) 计算数组各元素的指数值
np.sign(x) 计算数组各元素的符号值:1 (+),0,-1 (-)

NumPy 二元函数

函数 说明
+ - * / ** 两个数组各元素进行对应运算
np.maximum(x,y) or np.fmax(x,y)ornp.minimum(x,y) or np.fmin(x,y) 两个数组元素级的最大值、最小值计算
np.mod(x,y) 两个数组元素级的模运算
np.copysign(x,y) 将数组 y 中的各元素值的符号赋值给数组 x 的对应元素
> < >= <= == != 算术比较两个数组各元素,产生布尔型数组

Numpy 数据的存取

一维、二维数据的 CSV 存取

CSV (Comma‐Separated Value,逗号分隔值),CSV 是一种常见的文件格式,用来存储批量数据。
写入 CSV 文件:np.savetxt(fname, array, fmt, delimiter),其中 fname 指的是文件、字符串或者产生器,可以是.gz 或.bz2 压缩文件(NumPy 支持直接存入压缩文件以节省空间);array 指的是需要存入的数组;fmt 指的是写入文件的格式,例如:% d (十进制整数) %.2f (保留 2 位小数的浮点数) %.18e (保留 18 位小数点的科学计数法);delimiter 指的是分割字符串,默认是空格。
读取 CSV 文件:np.loadtxt(fname, dtype, fmt, delimiter),其中 fname 指的是文件、字符串或者产生器,可以是.gz 或.bz2 压缩文件(NumPy 支持直接读取压缩文件);dtype 指的是读取数据的类型,默认为浮点类型;delimiter 指的是分割字符串,默认是空格;uppack 指的是如果 True,读入属性将写入不同变量。
CSV 文件的局限性:
- CSV 只能有效存储一维和二维数组。
- np.savetxt()np.loadtxt() 只能有效存取一维和二维数组。

多维数据的 dat 存取

使用 tofile 函数保存多维数据:
写入 dat 文件:a.tofile(fname, sep, format),其中 a 指的是需要存入的数组;fname 指的是文件、字符串;sep 指的是数据分割字符串,如果是空格,写入文件为二进制。
读取 dat 文件:np.fromfile(fname, dtype, count, sep),其中 fname 指的是文件、字符串;dtype 指的是读取数据的类型;count 指的是读取数据的个数,如果 count=-1 则表示读入整个文件;sep 指的是数据分割字符串,如果是空格,以二进制读取文件。
注意:该方法需要读取时知道存入文件时数组的维度和元素类型,a.tofile () 和 np.fromfile () 需要配合使用,可以通过元数据文件来存储额外信息。

NumPy 便捷文件的存取

写入文件:np.save(fname, array),其中 fname 指的是文件名,以.npy 或者.npz 为扩展名,后者为压缩文件;array 指的是需要存入的数组。
读取文件:np.load(fname),其中 fname 指的是文件名,以.npy 或者.npz 为扩展名,后者为压缩文件。

NumPy 的随机数函数

NumPy 的随机函数子库:np.random.* 包含有关随机数的函数。

随机数组生成

函数 说明
rand(d0, d1, ..., dn) 根据 d0-dn 创建随机数数组,浮点数,[0, 1),均匀分布
randn(d0, d1, ..., dn) 根据 d0-dn 创建随机数数组,标准正太分布
randint(low[,high,shape]) 根据 shape 创建随机整数数组 范围是 [1ow, high),均匀分布
seed(s) 随机数种子 s 是给定的种子值,相同的种子值产生相同的随机数组
uniform(low,high,size) 产生具有均匀分布的数组,low 为起始值,high 为结束值,size 为形状
normal(loc,scale,size) 产生具有正太分布的数组,loc 为均值,scale 为标准差,size 为形状
poisson(lam,size) 产生具有泊松分布的数组,lam 为随机事件发生率,size 为形状

数组的随机变换

函数 说明
shuffle(a) 根据数组 a 的第 1 轴进行随机排列,改变数组 x
permutation(a) 根据数组 a 的第 1 轴产生一个新的乱序数组,不改变数组 x
choice(a[, size, replace, p]) 从一维数组 a 中以概率 p 抽取元素,形成 size 形状新数组
replace 表示是否可以重用元素,默认为 True

NumPy 的统计函数

函数 说明
sum(a, axis = None) 根据给定轴 axis 计算数组 a 相关元素之和
mean(a, axis = None) 根据给定轴 axis 计算数组 a 相关元素的期望
average(a, axis = None, weights = None) 根据给定轴 axis 计算数组 a 相关元素的加权平均值
std(a, axis = None) 根据给定轴 axis 计算数组 a 相关元素的标准差
var(a, axis = None) 根据给定轴 axis 计算数组 a 相关元素的方差
min(a) max(a) 计算数组 a 中元素的最小值、最大值
argmin(a) argmax(a) 计算数组 a 中元素最小值、最大值的降一维后下标
unravel_index(index, shape) 根据 shape 将一维下标 index 转换成多维下标
ptp(a) 计算数组 a 中元素最大值与最小值的差
median(a) 计算数组 a 中元素的中位数(中值),结果为浮点数

・axis = None 是统计函数的标配参数,axis 为整数或元组。

NumPy 的梯度函数

np.gradient(f):计算数组 f 中元素的梯度,当 f 为多维时,返回每个维度的梯度。
梯度:连续值之间的变化率,即斜率。例如:XY 坐标轴连续三个 X 坐标对应的 Y 轴值:a, b, c,其中,b 的梯度是 (c-a)/2。

图像的数据表示

图像一般使用 RGB 色彩模式,即每个像素点的颜色由红 (R)、绿 (G)、蓝 (B) 组成。
RGB 三个颜色通道的变化和叠加得到各种颜色,其中
・R 红色,取值范围:0‐255
・G 绿色,取值范围:0‐255
・B 蓝色,取值范围:0‐255
RGB 形成的颜色包括了人类视力所能感知的所有颜色。

PIL 库

Python Image Library:
安装:pip install pillow
调用:from PIL import Image
Image 是 PIL 库中代表一个图像的类(对象)。
图像是一个三维数组,维度分别是高度、宽度和像素 RGB 值。