Python中的科学计算
Numpy的生态系统(Ecosystem)
什么是Numpy? Numpy, Scipy, and Matplotlib 为python提供了类 似 MATLAB功能. 多重数组(矩阵) 快速的数值计算 (矩阵运算) 高层次的数学函数
NumPy的优势 相比而言,Python在数值运算方面通常比较慢,比 如: 1000 x 1000 矩阵乘法 Python > 10 min. Numpy ~0.03 seconds
大纲 数组(Arrays) 数组的形状与变换(Shaping and transposition) 数组的数学运算(Mathematical Operations) 索引与切片(Indexing and slicing) 广播机制(Broadcasting)
数组(Arrays) 数组的形状与变换(Shaping and transposition) 数组的数学运算(Mathematical Operations) 索引与切片(Indexing and slicing) 广播机制(Broadcasting)
数组(Arrays) 数字构成的结构化列表 向量(Vectors) 矩阵(Matrices) 图像(Images) 。。。
数组(Arrays) 𝑝 𝑥 𝑝 𝑦 𝑝 𝑧 𝑎 11 ⋯ 𝑎 1𝑛 ⋮ ⋱ ⋮ 𝑎 𝑚1 ⋯ 𝑎 𝑚𝑛 向量(Vectors ) 数字构成的结构化列表. 向量(Vectors ) 矩阵(Matrices) 图像(Images) 𝑝 𝑥 𝑝 𝑦 𝑝 𝑧 𝑎 11 ⋯ 𝑎 1𝑛 ⋮ ⋱ ⋮ 𝑎 𝑚1 ⋯ 𝑎 𝑚𝑛
数组(Arrays) 数字构成的结构化列表. 向量(Vectors ) 矩阵(Matrices) 图像(Images)
数组的基本特征 import numpy as np a = np.array([[1,2,3],[4,5,6]],dtype=np.float32) print(a.ndim, a.shape, a.dtype) 数组存在一个维度的概念,它可以是任何整数,包括0, 数组是有类型的: np.uint8, np.int64, np.float32, np.float64 数组必须是紧密的,数组中的每一个元素都必须存在而且是相同的类型。
创建数组 np.ones, np.zeros np.arange np.concatenate np.astype np.zeros_like, np.ones_like np.random.random
创建数组 np.ones, np.zeros np.arange np.concatenate np.astype np.zeros_like, np.ones_like np.random.random
创建数组 np.ones, np.zeros np.arange np.concatenate np.astype np.zeros_like, np.ones_like np.random.random
创建数组 np.ones, np.zeros np.arange np.concatenate np.astype np.zeros_like, np.ones_like np.random.random
创建数组 np.ones, np.zeros np.arange np.concatenate np.astype np.zeros_like, np.ones_like np.random.random
创建数组 np.ones, np.zeros np.arange np.concatenate np.astype np.zeros_like, np.ones_like np.random.random
创建数组 np.ones, np.zeros np.arange np.concatenate np.astype np.zeros_like, np.ones_like np.random.random
创建数组 np.ones, np.zeros np.arange np.concatenate np.astype np.zeros_like, np.ones_like np.random.random
注意事项 数组必须是紧密的,不能存在空洞 数组中的元素必须是同一类型 不能将不同形状的数组合并在一起
数组的形状与变换(Shaping and transposition) 数组(Arrays) 数组的形状与变换(Shaping and transposition) 数组的数学运算(Mathematical Operations) 索引与切片(Indexing and slicing) 广播机制(Broadcasting)
数组的形状 a = np.array([1,2,3,4,5,6]) a = a.reshape(3,2) a = a.ravel() 总量固定, 可以利用-1 推断对应坐标轴的形状 行优先。
返回值 Numpy 的函数运算可以返回视图(views )或者拷 贝(copies). 视图(Views )与原始的数组共享数据,类似于之 前所说的指称(references)。改变视图的元素也会 原始数组发生改变。 Numpy的文档 给出了哪些函数返回视图哪些函数返 回拷贝 运用np.copy, np.view两个函数可以直接指定是拷贝 还是视图。
数组的转置 a = np.arange(10).reshape(5,2) a = a.T a = a.transpose((1,0)) np.transpose的作用是交换坐标轴, a.T交换头两个坐标轴。
保存和载入数组 np.savez(‘data.npz’, a=a) data = np.load(‘data.npz’) a = data[‘a’] NPZ 文件可以保存多重数组 np.savez_compressed 也可以执行类似的功能。
图像数组(Image Array) 在计算机中,图像(Images)是一个3D的数组: 宽(width), 高(height), 和频道(channels) 常用的图像形式: height x width x RGB height x width 变化: 渠道也可能是BGR 数组可能是 [width x height],而不是[height x width]
存储和调入图像 SciPy: skimage.io.imread,skimage.io.imsave height x width x RGB PIL / Pillow: PIL.Image.open, Image.save width x height x RGB OpenCV: cv2.imread, cv2.imwrite height x width x BGR
小结 我们已经介绍了如何创建数组、改变数组形状、以及 数组转置 Questions?
数组的数学运算(Mathematical Operations) 数组(Arrays) 数组的形状与变换(Shaping and transposition) 数组的数学运算(Mathematical Operations) 索引与切片(Indexing and slicing) 广播机制(Broadcasting)
数学运算 Numpy可以对数组进行逐个元素的算术运算 逻辑运算返回的是布尔数组 运算会导致数组的实时改变
数学运算 Numpy可以对数组进行逐个元素的算术运算 逻辑运算返回的是布尔数组 运算会导致数组的实时改变
数学运算 Numpy可以对数组进行逐个元素的算术运算 逻辑运算返回的是布尔数组 运算会导致数组的实时改变
数学运算 Numpy可以对数组进行逐个元素的算术运算 逻辑运算返回的是布尔数组 运算会导致数组的实时改变
数学运算中向上兼容 所有数学运算会向上兼容运算精度. uint64 + uint16 => uint64 float32 / int32 => float32
数学运算中的通用函数 在Numpy中存在一个特别的类型:ufuncs 这一函数运算依然是逐个元素进行的(Element- wise) 例如: np.exp np.sqrt np.sin np.cos np.isnan
数学运算中的通用函数 在Numpy中存在一个特别的类型:ufuncs 这一函数运算依然是逐个元素进行的(Element- wise) 例如: np.exp np.sqrt np.sin np.cos np.isnan
数学运算中的通用函数 在Numpy中存在一个特别的类型:ufuncs 这一函数运算依然是逐个元素进行的(Element- wise) 例如: np.exp np.sqrt np.sin np.cos np.isnan
索引与切片(Indexing and slicing) 数组(Arrays) 数组的形状与变换(Shaping and transposition) 数组的数学运算(Mathematical Operations) 索引与切片(Indexing and slicing) 广播机制(Broadcasting)
Numpy中的索引(Indexing) 注意事项: x[0,0] # top-left element x[0,-1] # first row, last column x[0,:] # first row (many entries) x[:,0] # first column (many entries) 注意事项: 和普通Python序列类型一样,是从0开始的 对于多维数组,每个维度使用逗号分隔。
数组的索引和切片 切片返回的结果是视图(views)。任何对切片的修改都会覆 盖原始数组 I = I[:,:,::-1] # 交换 I[I<10] = 0 # 筛选与赋值 I[[1,3], :] # 查询第2和4行的所有元素 切片返回的结果是视图(views)。任何对切片的修改都会覆 盖原始数组 可以使用列表或者布尔数组实现切片操作(Fancy Indexing), 注意此时返回的结果是拷贝而不是试图.
Python传统的切片操作 格式: start:stop:step a = list(range(10)) a[:3] # indices 0, 1, 2 a[-3:] # indices 7, 8, 9 a[3:8:2] # indices 3, 5, 7 a[4:1:-1] # indices 4, 3, 2 (this one is tricky)
数组中的坐标轴 a.sum() # 将所有元素进行求和运算 a.sum(axis=0) # 对每一行的所有元素求和 a.sum(axis=1, keepdims=True) 利用坐标轴参数控制运算实施的对象 通常指定好的坐标轴会在结果中消除,使用 keepdims可以保留所有维度
数组中的坐标轴
汇总函数(Aggregate Functions) 如何对一个数组求平均值 np.mean(data) data.mean()
汇总函数(Aggregate Functions)
广播机制(Broadcasting) 数组(Arrays) 数组的形状与变换(Shaping and transposition) 数组的数学运算(Mathematical Operations) 索引与切片(Indexing and slicing) 广播机制(Broadcasting)
Numpy 中的广播机制(Broadcasting) a = a + 1 # add one to every element 当我们对多个数组进行运算的时候,就会用到广播机制 每个维度必须实现匹配,从右往左的方式实现匹配 大小为1的维度会自动广播(就好像自动复制一样) 如果维度不包含1,那么,多个数组必须有相同的形状 额外的大小为1的维度会按照需要添加在最左边。
Numpy 中的广播机制(Broadcasting)
广播机制的例子 假设我们希望向一个图像数组中加入一个颜色取值 a + b 会自动将额外两个维度,从而让b自动变成1 x 1 x 3的形状。 a.shape is (100, 200, 3) b.shape is (3, ) a + b 会自动将额外两个维度,从而让b自动变成1 x 1 x 3的形状。 a+b这一加法运算将会在第一和第二个维度进行广播。
失败的广播 如果a.shape是(100, 200, 3),但是b.shape (4, ), 那么,a + b 将会出错。 因此,广播中要求右侧的数组要么和左侧数组形状一 致,要么是1。
一些需要避免bug的方法 需要准确知道数据类型 需要时刻注意返回的结果是视图还是拷贝 可以利用matplotlib做一些直观的测试 利用pdb. 数组的乘法(np.dot vs np.multipy).