单元 一
一、数组的索引和切片
- Numpy简介
- np.array([]) 补充了python中没有数组的缺陷
- numpy低层是C语言,支持多维数据整体操作
- numpy中支持多种形式的数据,以及复数,如int32, float64,等
- nd.array 数组可以由非同质的对象构成,非同质ndarray元素为对象类型,非同质ndarray对象无法有效发挥NumPy优势,尽量避免使用
- ndarray支持多种类型的数据,这样在科学计算中帮助程序员预估需要的内存大小
名称 | 功能 |
---|---|
.ndim | 秩,轴的数量或维度 |
.shape | 数组大小,对于矩阵就是行和列 |
.size | 元素个数 |
.dtype | 对象的元素类型 |
.itemsize | 每个元素的大小,以字节为单位 |
ndarray支持的元素类型 | 说明 |
---|---|
bool | 布尔类型,true,false |
intc | C语言中类型一致,一般是int32/int64 |
intp | 用于索引的整数 |
int16 | 16长度的整数,[-2^16, 2^16] |
int8 | … |
int32 | … |
int64 | … |
… | … |
a=np.array([2,3])
a.shape # (1,2)
a.ndim # 1
a.dtype # dtype('int32')
a.size # 2
- 一维数组
- 一维数组的索引,从右到左是-1逐渐递减;创建可以用np.array([2,.])
- 一维数组的切片,一次选择多个元素 a[2:3:4] 三个元素依次是指 起始编号:终止编号(不含):步长
a=np.array([2,3,4,5,6,7])
print(a[:,:,2])
# array([2,4,6])
- 多维数组
- 多维数组的索引 a=np.arange(24).reshape(1,2,3) 取从0到23的数,将其分为123的张量
- 多维数组的切片索引a(:,1,-3) # 在每个维度上都可以用冒号表示区间,不同维度用逗号分隔
- 在不同维度上也可以使用步长,如下面的例子 print(a[:,::2])输出矩阵隔一个元素所获得的值
a=np.arange(24).reshape(3,8)
print(a[:,3])
print(a[:,::2])
二、np.array的运算
- 与常数运算,数组每个元素都和常数运算
a=np.array([3,4,5])
print(a.mean())
print(a*4)
- numpy常用的对数组数据的操作
名称 | 功能 |
---|---|
a**3 | a^3 |
np.abs(x),np.fabs(x) | 绝对值 |
np.sqrt(x) | 开方 |
np.square(x) | 平方 |
np.log(x),np.log10(x),np.log2(x) | 自然对数,10为底对数,2为底对数 |
np.rint(x) | 各元素的四舍五入值 |
np.modf(x) | 将各元素的小数部分和整数部分以两个独立数组形式返回 |
np.cos(x),… | 可以计算各元素的三角函数值,其他的类型用到再查 |
np.exp(x) | 指数值 |
np.sign(x) | 各元素符号值,1(+),0,-1(-),即元素值为正数时为1,负数时为-1,其他为0 |
… |
- 二元数组的操作
Name | Definition |
---|---|
np.maximun(x,y) | 取两个元素对应位置的元素的最大值组成新数组 |
单元二 数据存取和函数
一、CSV文件存取
-
CSV(Comma-Seperated Value,逗号分隔值),一种常见文件格式用来存储批量数据,以逗号分隔
-
CSV存储的局限性: (1) 只能有效存储一维和二维数组
-
CSV文件存取的函数:
(1)
np.savetext(frame, array, fmt='%.18e', delimiter=',')
- frame: 文件名,可以是.gz 或 .bz2的压缩文件
- array: 待存入的数组
- fmt: 写入文件格式,如 %d, %.2f, %.18e
- delimeter: 分隔字符串,默认是空格
(2)
np.loadtext(frame, dtype=np.float, delimiter=',', unpack=false)
- frame: 文件名,可以是.gz 或 .bz2的压缩文件
- dtype: 数据类型
- delimeter: 分隔字符串,默认是空格
- unpack: 如果为True, 读入属性将分别写入不同变量
a=np.arange(100).reshape(5,20)
np.savetxt('a.csv',a,fmt='%d',delimiter=',')
b=np.loadtxt('a.csv',dtype=np.int,delimeter=',')
二、多维数据的存取
多维数据的存取这里介绍两种方法:a.tofile
&a.fromfile
和np.save
&np.load()
2.1
- tofile()函数和fromfile()需要配合使用。该方法需要读取时知道存入文件时数组的维度和元素类型才可以还原,可以通过元数据文件来存取额外信息
2.1.1 a.tofile(frame, sep=' ', format='%s')
- frame: 文件名,后缀可以是
.dat
- sep: 数据分隔字符串,如果是空,则写入文件为二进制格式
- format: 写入数据的格式,如
%d
a=np.arange(100).reshape(5,10,2) a.tofile('a.dat',sep=',',format='%d')
- 存为二进制文件
2.2.2 np.fromfile(frame, dtype=float, count=-1, sep=' ')
- frame: 文件,字符串
- dtype: 读取的数据类型
- count: 读入元素个数,-1表示读入整个文件
- sep: 数据分隔字符串,如果是空串,写入文件为二进制
c=np.fromfile("b,dat", dtype=np.int, sep=", ")
在这里插入图片描述
2.2 numpy类型自有的便捷文件存取
np.save("a.npy",a)
文件存储,后缀为.npy
np.sazez("a.npz",a)
文件存为压缩文件,后缀为.npz
np.load("a.npy")
文件获取
三、NumPy的随机数函数
3.1 生成随机数的四个基本函数,前缀均为np.random.**
a=np.random.rand(3,4,5) # 0,1均匀分布 b=np.random.randn(3,4,5) # 标准正态分布 c=np.randint(100,200,(3,4)# 在100-200内取12个值,形成3*4的矩阵 np.random.seed(1) # 种子可以实现,种子后对应的参数相同的相同随机函数类型可以生成相同的矩阵 np.random.randint(100,200,(3,4)) np.random.seed(1) np.random.randint(100,200,(3,4))
注:均匀分布是连续分布,具体定义如下
3.2 np.random的随机函数操作函数
函数 | 说明 |
---|---|
shuffle(a) | 根据数组a的第一轴进行随机排列,改变数组第0轴排序 |
permutation(a) | 根据数组的第1轴产生一个新的乱序数组,不改变数组x |
choice(a[size,replace,p]) | 从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认是false |
3.3 NumPy的随机函数(3)
函数 | 说明 |
---|---|
uniform(low, high, size) | 均匀分布数组,low,起始值,high结束值,size形状 |
normal(loc,scale,size) | 正态分布数组,loc均值,scale标准差,size形状 |
possion(lam,size) | 泊松分布数组,lam随机事件发生概率,size形状 |
四、NumPy的统计函数
4.1 NumPy的统计函数
注:axis=None是统计函数的标配参数
函数 | 说明 |
---|---|
sum(a,axis=None) | 根据给定轴axis计算相关元素和,axis可以是整数或元组 |
mean(a,axis=None) | 根据给定轴计算期望,axis可以是整数或数组 |
average(a,axis=None, weights=None) | 计算给定轴相关元素加权平均 |
std(a,axis=None) | 计算给定轴的标准差 |
var(a,axis=None) | 计算给定轴的方差 |
- 注意average()函数可以实现加权平均/font<>
4.2 NumPy的统计函数(2)
函数 说明 min(a),max(a) 数组a中元素最大,最小值 argmin(a),argmax(a) 返回最大,最小值的降一维后下标 unravel_index(index, shape) 根据shape将获得的值的降一维下标index转换成原多维下标 ptpt(a) 计算最大与最小值的差 median(a) 计算数组中元素的中位数
4.3 NumPy的梯度函数
函数 | 说明 |
---|---|
np.gradient(f) | 计算数组f中元素的梯度,当f为多维时,返回每个维度梯度 |
- 梯度:连续值之间的变化率,即斜率。XY坐标轴连续三个X坐标对应的Y轴值:a,b,cm其中,b的梯度是:(c-a)/2
- 对于数组中grad的计算,当数据两侧都有值时,grad计算公式为
(v3-v1)/2(c-a)/2
- 当数组中边缘处的值,计算为当前值减去其相邻值,除数为1。
(v2-v1)/1
五、案例:利用NumPy进行图像数据的简单处理
5.1. 图像的数组表示:
- RGB 三个颜色通道的变化和叠加得到各种颜色,其中
- R 红色,取值范围,0-255;G 绿色,B,蓝色
- RGB 形成的颜色包括了人类视力所能感知的所有颜色
5.2. PIL(Python Image Library)
PIL 库是强大图像处理能力的第三方库
- 使用方法
from PIL import Image
- 图像的数组表示
- 图像是一个三维数组,维度分别是高度,宽度和像素RGB值
5.2 图像变换
- 读入图像后,获得像素RGB值,修改保存为新的文件
from PIL import Image
import numpy as np
a=np.array(Image.open("D:/test.jpg"))
b=[255,255,255]-a
im=Image.fromarray(b.astype('uint8'))
im.save("D:/test_save.jpg")
- 图像的变换
5.3 图像手绘效果实例分析
- 手绘效果的几个特征: 黑白灰色+边界线条较重+相同或相近色彩趋于白色+略有光源效果
- 利用像素之间梯度值(明暗效果)和虚拟深度值(立体效果,光源效果)对图像进行重构,根据灰度变化模拟人类视觉的远近程度
- 光源效果:设计一个位于图像斜上方的虚拟光源建立光源对个点梯度值的影响函数,运算出各点的新像素值
- 梯度归一化,为了避免数据越界,将生成的灰度值裁剪为0-255区间的值