python杂项记录——numpy/语法语句/sklearn/matplotlib/tkinter/keras
一、 numpy库
1.1 建立列表——np.array()
tips:
- np.arrary(),用[]对列表初始化
- 用嵌套的[]层数区分几维列表,每嵌套一对[]则增加一个新的维度,二维数组,三维张量
import numpy as np
array_1=np.array([1,2,3])#一维
array_2 = np.array([
[1, 1,1],
[1, 2,3]
])#二维
array_3 = np.array([
[[1, 1,1],
[1, 2,3]],
[[2, 2,2],
[1, 2,3]]
])#三维
1.2 读取数组长度——np.shape()
tips:
- 数组变量名.shape无参:显示数组形状,如二维显示(行数,列数),其中行数是第一维度的长度
- np.shape(数组变量名):显示数组形状
- 数组变量名.shape[i]:显示第i个维度的长度,维度不一致时,要加参数dtype=object,且不一致的维度没有长度
#接上1.1的程序段
print(array_1.shape);
print(array_1.shape[0]);#第一个维度是3
print("**************");
print(array_2.shape);
print(np.shape(array_2));
print(np.shape(array_2[0]));#读取子数组的形状
print(array_2.shape[0]);#读取维度的长度
print("**************");
print(array_3.shape);
print(array_3.shape[2]);#第3个维度是3
1.3 全零数组——np.zeros()
tips:
- 返回一个给定形状和类型的用0填充的数组
- 语法:
img=np.zeros(shape, dtype=float, order=‘C’)
参数名 | 参数值 | 含义 |
---|---|---|
shape | ( , , , ) | 给定数组形状 |
dtype | 默认np.float64 | 数据类型,可选参数 |
order | c:行优先;f:列优先 | 优先,可选参数 |
1.4 数组乘法——np.multiply()、np.dot()和*
1.4.1 np.multiply()
数组和矩阵对应位置相乘,输出与相乘数组/矩阵的大小一致,example:8=2*4
1.4.2 np.dot()
tips:
- 对于秩为1的数组,执行对应位置相乘,然后再相加,最终得到的是一个数字;
- 对于秩不为1的二维数组,执行矩阵乘法运算;
- 乘法运算:np.dot(A,B),用A的行乘以B对应的列再相加,example:7=11+32
1.4.3 星号*
对数组执行对应位置相乘
对矩阵执行矩阵乘法运算
1.5 矩阵求和——np.sum()
矩阵内所有元素求和
1.6 数组重组——np.reshape()
- 语法:
reshape(nx,ny): 将数据重组成nx行,ny列的数据。
reshape(-1,ny): 将数据重组成ny列的数据,行数自动计算、自动调整。
reshape(nx,-1): 将数据重组成nx行的数据,列数自动计算、自动调整。
- 对于含自动计算的语法,注意要能够整除,保证新矩阵的规整性。
1.7 图像边缘填充——np.pad()
tips:
- 目的/效果:为了避免因为卷积运算导致输出图像缩小和图像边缘信息丢失
- 方法:在图像四周边缘填充0
- 语法
img_1= np.pad(img_0, pad_width, mode, **kwargs)
参数名 | 参数值 | 效果 |
---|---|---|
img_0 | 待填充的原图像/数组 | |
pad_width | 各维度的各个方向上想要填补的长度 | |
mode | 填充的方式 | |
**kwargs | 表示填充的值,与pad_width相对应,缺省填充0(?) | |
mode | ‘constant’ | 连续填充相同的值,每个维度可以分别指定填充值 |
mode | 'edge" | 用边缘值填充 |
mode | ‘linear_ramp’ | 用边缘递减的方式填充 |
mode | ‘maximum’/‘minimum’/‘mean’/‘median’ | 最大值/最小值/均值/中位数填充 |
mode | ‘reflect’/‘symmetric’ | 对称填充 |
mode | ‘wrap’ | 用原数组后面的值填充前面,前面的值填充后面 |
二、 其他内容——语法、语句
2.1 整除——“//"
"//"表示整数除法,它可以返回商的整数部分,向下取整
2.2 if __ name __ == “__ main __”
tips:
- 作用:程序入口
运行情况 | 效果 |
---|---|
当.py文件被直接运行 | if name == 'main’之下的代码块将被运行 |
当.py文件以模块形式被导入 | if name == 'main’之下的代码块不被运行 |
- 名词
变 量 名 称 | 含义 |
---|---|
_ _ name _ _ | 用于表示当前模块的名字 |
_ _ main _ _ | 如果一个.py文件(模块)被直接运行时,其__name__值为__main__,即模块名为__main__ |
2.3 with as 语句
tips:
- 语法格式:
括号部分可以使用,也可以省略
with 表达式 [as target]:
代码块
- 用法:将表达式的结果保存到target变量中
- 例子:文件a写入"hello,world!"
with open('D:\\a.txt','w') as f:
f.write("hello,world!")
三、 机器学习模型——sklearn库
3.1 聚类
3.1.1 kmeams模型
tips:
- 库
from sklearn.cluster import KMeans
- 语法参数
KMeans(n_clusters= ,max_iter= ,n_init= ,init= ,algorithm= )
参数名 | 参数值 | 效果 |
---|---|---|
n_clusters | 数字 | k值,分类的类别数 |
max_iter | 数字 | 最大迭代数 |
n_init | 默认是10 | 用不同的初始化质心运行算法的次数,一般不需要改 |
init | 初始化的k个质心 | 初始值选择的方式 |
init | ‘random’ | 随机 |
init | 默认’k-means’ | |
algorithm | 算法区别 | |
algorithm | ‘auto’ | 根据数据值是否是稀疏 |
algorithm | ‘full’ | 传统的K-Means算法 |
algorithm | ‘elkan’ | 数据是稠密的 |
四、数据视图——matplotlib库
4.1 散点图——plt.scatter()
tips:
- 用于生成散点图
- 语法参数:
plt.sactter(x,y,size,c= ,marker= ,alpha= )
参数名 | 参数值 | 含义 |
---|---|---|
x | 数据 | 横轴数据 |
y | 数据 | 纵轴数据 |
size | 数字,默认20 | 散点的大小 |
c | ‘b’=blue /‘c’=cyan/‘g’=green/‘k’=black/‘r’=red/‘w’=wirte/‘y’=yellow | 色彩或颜色序列 |
marker | 默认’o’ | 标记的样式 |
alpha | 0-1之间 | 散点透明度 |
4.2 创建绘图区域/画布——plt.figure()
tips:
- 作用:和plt.subplot()一起用,用于创建一个显示多图像的画布。
- 语法参数:
plt.figure(num= ,figsize= ,dpi= ,facecolor= ,edgecolor= ,frameon= )
参数名 | 参数值 | 作用 |
---|---|---|
num | 图像编号或名称,数字为编号 ,字符串为名称,不指定调用figure时就会默认从1开始 | |
figsize | 指定figure的宽和高,单位为英寸 | |
dpi | 参数指定绘图对象的分辨率,即每英寸多少个像素 | |
facecolor | 背景颜色 | |
edgecolor | 边框颜色 | |
frameon | ‘y’/‘n’ | 是否显示边框 |
4.3 创建单个子图——plt.subplot()
tips:
-
subplot可以将figure划分为n个子图,但每条subplot命令只会创建一个子图 。使用for 循环绘制多个子图。
example:两行三列
-
语法参数:
plt.subplot(nrows,ncols,sharex,sharey)
参数名 | 参数值 | 含义 |
---|---|---|
nrows | 数字 | 将画布划分成 i 行 |
ncols | 数字 | 将画布划分成 j 列 |
indx | 对子图编号 |
4.4 图像刻度——plt.ticks()
tips:
- plt.xticks() 是x 轴刻度,plt.yticks() 是y 轴刻度
- plt.xticks([]) 是不显示x 轴的刻度; plt.yticks([]) 是不显示y 轴的刻度
- plt.xticks(np.arange(3)) 就将生成的最后一个图的横坐标设置为只有0、1和2三个刻度
- examplre:横轴无刻度,数轴四个刻度
4.5 刻度标题——plt.label()
tips:
- plt.xlabel() 是x 轴标题,plt.ylabel() 是y 轴标题
- 效果:
4.6 绘制网格——plt.grid()
tips:
- 语法:
plt.grid()
- 效果:
五、图形用户界面GUI——tkinter库
原帖:https://www.jianshu.com/p/91844c5bca78,仅作常用内容整理
5.1 窗体
tips:
- 导入库:from tkinter import *
- 初始化窗体:Tk()
- 窗体标题:title(‘标题’)
- 窗体大小:geometry('长x宽‘)
- 在显示屏上显示窗体,窗体进入等待事件响应状态:mainloop()
from tkinter import *
root= Tk()
root.title('hello world')
root.geometry('240x240') # 这里的乘号不是 * ,而是小写英文字母 x
root.mainloop()
5.2 控件
5.2.1 控件共同属性
5.2.2 控件布局.像素坐标——place()
注:有pack()、grid()、place()三种,仅整理place()和pack()
tips:
- 控件变量名.pace()用于设置该控件的位置信息
- 根窗体左上角为(0,0),水平向右,垂直向下为正方向;x是水平方向,y是垂直方向。
- 语法参数:相对数值(relative)和绝对数值只要有一类,能表明长宽和位置信息就可以
message_01.pace(x= ,y= ,relx= ,rely= ,height= ,width= ,relheight= ,relwidth= )
参数名 | 参数值 | 含义 |
---|---|---|
x,y | 起始位置的像素坐标 | |
relx,rely | 在0-1之间 | 起始位置,相对于窗体的宽高比例,相对的位置 |
height,width | 控件本身的像素高度和像素宽度 | |
relheight,relwidth | 在0-1之间 | 控件本身相对于根窗体的高度和宽度 |
5.2.3 控件布局.简单最小——pack()
注:有pack()、grid()、place()三种,仅整理place()和pack()
tips:
- 不加参数的.pack():按布局语句的先后,以最小占用空间的方式自上而下地排列控件实例,并且保持控件本身的最小尺寸。
- 加参数的.pack(fill=’ ‘,side’ '):
参数名 | 参数值 | 含义 |
---|---|---|
fill | 填充 | |
fill | ‘X’ | 水平方向填充 |
fill | ‘Y’ | 垂直方向填充 |
fill | ‘BOTH’ | 二维伸展填充 |
side | 本控件实例的布局相对于下一个控件实例的方位 | |
side | ‘TOP’/‘RIGHT’/‘LEFT’/‘RIGHT’/‘BOTTOM’ |
examples:
5.2.4 标签和消息——Label/Message
tips:
- 功能:用于呈现文本信息
- 区别:单行与多行
- 动态更新文本方法:
1)使用configure()
先定义一个控件实例label_1,再通过调用以下函数修改文本信息。
label_1 = tk.Label(root,text='old',fg='blue',font=("黑体",80))
label_1.pack()
#当需要修改Lb内容时,调用以下语句
label_1.configure(text='new')
2)使用内部变量svar=tk.StringVar()
先定义一个内部变量svar,在初始化Label时赋值给Label的参数textvarible,再通过svar.set()修改svar,来修改Label内的文本内容
svar=tkinter.StringVar()
svar.get('old')
label_2= tk.Label(root,textvariable=svar,fg='blue',font=("黑体",80))
label_2.pack()
#当需要修改Lb内容时,调用以下语句
svar.set('new') # 获取当前时间
example:
5.2.5 文本框——Text
区别:entry是接收单行文本输入的控件
tips:
- 初始化:txt_1=Text(窗体变量名)
- 函数:
位置参数可取整数、浮点数或END(末尾)
- example:
from tkinter import *
import time
import datetime
def gettime():
s=str(datetime.datetime.now())+'\n'#读取时间
txt.insert(END,s)#后缀增加
root.after(1000,gettime) # 每隔1s调用函数 gettime 自身获取时间
root=Tk()
root.geometry('320x240')
txt=Text(root)#在root窗口中生成txt文本
txt.pack()#文本框位置
gettime()
root.mainloop()
5.2.6 输入框——Entry
tips:
- 初始化:ent_1=Entry(窗体变量名)
- 函数:
位置参数可取整数、浮点数或END(末尾)
函数 | 用途 |
---|---|
get() | 取值 |
delete(其实位置,终止位置) | 删除 |
5.2.7 按钮框——Button
tips:
- 主体初始化:
button_1=tk.Button(窗体名,text=' ',command= )
参数名 | 参数值 | 含义 |
---|---|---|
text | 按钮内的文字 | |
command | 触发按钮需要执行的功能函数名 |
**
关于command:
1)直接调用函数:表达式为“command=函数名”,函数名后面不加括号,也不能传递参数。
2)调用参数:表达式为“command=lambda:函数名(参数列表)”,其中参数列表使用.get()的形式
3)examples:
from tkinter import *
def run1():
a = float(inp1.get())
b = float(inp2.get())
s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)
txt.insert(END, s) # 追加显示运算结果
inp1.delete(0, END) # 清空输入
inp2.delete(0, END) # 清空输入
def run2(x, y):
a = float(x)
b = float(y)
s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)
txt.insert(END, s) # 追加显示运算结果
inp1.delete(0, END) # 清空输入
inp2.delete(0, END) # 清空输入
# 方法-直接调用 run1()
btn1 = Button(root, text='方法一', command=run1)
btn1.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)
# 方法二利用 lambda 传参数调用run2()
btn2 = Button(root, text='方法二', command=lambda: run2(inp1.get(), inp2.get()))
btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)
**
- 修改按钮变量
可用修改按钮上的文字、对按钮的状态重新赋值
Button1.configure(text=' ', state=' ')
参数名 | 参数值 | 含义 |
---|---|---|
text | 按钮内的文字 | |
state | ‘normal’/‘active’/disabled’ | 按钮功能状态 |
5.2.8 单选按钮——Radiobutton
tips:
- 主体初始化:
rd1=Radiobutton(窗体变量名,text=' ',variable= ,value= ,command= )
参数名 | 参数值 | 含义 |
---|---|---|
text | 按钮内的文字 | |
variable | 给该组单选框按钮设置共同变量名,用于读取返回 | |
value | 给当前单个单选框按钮编码,设置返回数值 | |
command | 触发按钮需要执行的功能函数名 |
通过“variable中设置的变量名.get()”来获得被选中实列的value值
2. examples:
from tkinter import *
def Mysel():
dic = {0:'甲',1:'乙',2:'丙'}
s = "您选了" + dic.get(var.get()) + "项"
lb.config(text = s)
root = Tk()
root.title('单选按钮')
lb = Label(root)
lb.pack()
var = IntVar()
rd1 = Radiobutton(root,text="甲",variable=var,value=0,command=Mysel)
rd1.pack()
rd2 = Radiobutton(root,text="乙",variable=var,value=1,command=Mysel)
rd2.pack()
rd3 = Radiobutton(root,text="丙",variable=var,value=2,command=Mysel)
rd3.pack()
root.mainloop()
5.2.9 文件选择对话框——tkinter.filedialog包
tips:
- 功能:弹出文件选择对话框,让用户直观地选择一个或一组文件,以供进一步的文件操作。
- 使用:可设置内部变量svar=tk.StringVar()用于保存地址,一般与button连用,设置一个"打开文件夹“的按钮,在command对应的函数中添加.askopenfilename
svar= tk.StringVar()#保存地址变量
filename = tk.filedialog.askopenfilename() #弹出文件选择对话框
svar.set(filename)#保存地址
六、神经网络模型——keras库
6.1 预处理:类别转换成one-hot编码——tf.keras.utils.to_categorical()
tips:
- one-hot编码(独热编码/一位有效编码):使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
- examples:对四位编码
- 语法参数:
tf.keras.utils.to_categorical(
y,
num_classes=None
)
参数名 | 参数值 | 含义 |
---|---|---|
y | 待编码数据 | |
num_classes | 标签类别总数 |
- 应用——对于数据预处理:标签转换+图像统一
补充:数据类型转化函数——astype()
example:
# 数据预处理
import tensorflow as tf
#将标签向量换成one-hot编码
num_classes = 10
y_train = tf.keras.utils.to_categorical(y_train, num_classes)
y_test = tf.keras.utils.to_categorical(y_test, num_classes)
print(y_train.shape, 'ytrain')
# 图像数据统一并缩小
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
6.2 Sequential模型
6.2.1 导入库并建立模型
from keras.models import Sequential
from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout
from tensorflow import optimizers
#建立模型
model = tf.keras.Sequential()
6.2.2 添加图层(layers)进入模型
**只记录常用的主要参数,参数表并不全**
1、二维卷积层Conv2D
tips:
- 功能:动态地提取图像特征,由滤波器filters和激活函数构成。
- 特点:局部连接(稀疏连接)和权值共享;
1)局部连接:卷积层的节点仅仅和其前一层的部分节点相连接,只用来学习局部区域特征;
2)权值共享: 卷积核上面的权重参数是空间共享的; - 语法参数:
一般要设置的超参数包括卷积核大小、步长,激活函数类型,填充类型
model.add(Conv2D(kernel_size,strides=( , ),padding=' '))
参数名 | 参数值 | 含义 |
---|---|---|
kernel_size | (x,y) or 数字 | 卷积核的大小,如果是方阵可以直接写成一个数 |
strides | (x,y) | 控制卷积在x、y方向上的步长,,默认是卷积核尺寸 |
padding | 边缘填充,默认是不填充 | |
padding | ‘same’ | 通过kernel_size 缩小了维度,但是四周会填充 0,保持原先的维度 |
padding | ’valid’ | 存储不为 0 的有效信息 |
2、激活层Activation
tips:
1、功能:对一个层的输出施加激活函数。
2、语法参数:
model.add(Activation(activation=' '))
参数名 | 参数值 | 含义 |
---|---|---|
activation | 激活函数 | |
activation | ‘relu’ | 常用激活函数 |
activation | ‘softmax’ | 常用激活函数 |
activation | ‘Sigmoid’ | 常用激活函数 |
activation | ‘Tanh’ | 常用激活函数 |
3、 最大池化层MaxPooling2D
tips:
- 功能: 对提取到的特征信息进行降维。
- 目的:
1)使特征图变小,简化网络计算复杂度;
2)特征压缩,提取主要特征,增加平移不变性,减少过拟合风险。 - 语法参数:
model.add(MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid'))
参数名 | 参数值 | 含义 |
---|---|---|
pool_size | (x,y),默认是(2,2) | 池化核的尺寸 |
strides | (x,y) | 控制在x、y方向上的步长,默认是池化核尺寸 |
padding | 边缘填充,默认是不填充 | |
padding | ‘same’ | 通过kernel_size 缩小了维度,但是四周会填充 0,保持原先的维度 |
padding | ’valid’ | 存储不为 0 的有效信息 |
4、 展平层Flatten
tips:
- 功能:将输入层的数据压成一维的数据
- 位置:卷积池化层和全连接层之间。因为全连接层只能接收一维数据,而卷积层可以处理二维数据
- 语法参数:
model.add(Flatten())
5、 全连接层Dense
tips:
- 功能:处理“压缩的图像信息”并输出结果
- 位置:在经过数次卷积和池化之后,先对结果进行展平,再输入全连接层
- 语法参数:
model.add(Dense(units=' ', activation=' ',input_shape=' '))
参数名 | 参数值 | 含义 |
---|---|---|
units | 指定该网络层中的神经元个数 | |
activation | 激活函数,默认None,如果不是 None,则会应用于输出 | |
activation | ‘relu’ | 常用激活函数 |
activation | ‘softmax’ | 常用激活函数 |
activation | ‘Sigmoid’ | 常用激活函数 |
activation | ‘Tanh’ | 常用激活函数 |
input_shape | 输入数据的形状,全连接层的第一层必须指明 |
6、 输出层Dropout
tips:
- 功能:dropout正则化,以按照一定频率,随机地将输入的中的一些节点数值设置为0,可以防止过拟合
2.没有需要学习的参数,只在训练过程中其作用
3.语法参数:
model.add(Dropout(rate,seed=None))
参数名 | 参数值 | 含义 |
---|---|---|
rate | 0-1之间 | 每个元素以rate的概率丢弃,也就是变成了0,在训练和预测时都生效(?) |
seed | 随机种子 |
6.2.3 选择优化器和指定损失函数
model.compile(loss=' ', optimizer=' ', metrics=' ')
参数名 | 参数值 | 含义 |
---|---|---|
loss | 损失函数 | |
loss | ’mse’ | 均方差损失函数 |
loss | ‘categorical_crossentropy’/'spare_categorical_crossentropy | 多分类交叉熵损失函数(当使用one-hot编码时用前一个) |
loss | ’binary_crossentropy’ | 二分类交叉熵损失函数(与激活函数 Sigmoid 搭配使用) |
optimizer | 优化器 | |
optimizer | ‘sgd’ | 优化器 |
optimizer | ‘adagrad’ | 优化器 |
optimizer | ‘adadelta’ | 优化器 |
optimizer | ‘adam’ | 优化器 |
metrics | 训练模型时的评价指标 | |
metrics | ‘accuracy’ | |
metrics | ‘binary_accuracy’ | 二分类 |
metrics | ‘categorical_accuracy’ | 多分类 |
6.2.4 训练模型
model.fit(x_train, y_train, batch_size= , epochs=10,shuffle= ,validation_data=(x_val, y_val))
参数名 | 参数值 | 含义 |
---|---|---|
x_train, y_train | 训练数据 | |
batch_size | 数字 | 批量大小 |
epochs | 数字 | 迭代次数 |
shuffle | ’true’/‘false’ | 每轮训练前是否打乱数据 |
validation_data | (测试集的输入特征,测试集的标签) | 划分测试集数据,与validation_split二选一 |
validation_split | 0-1之间的小数 | 划分测试集数据,与validation_data二选一,测试集于训练集的比例 |
validation_freq | 默认为1 | 测试频率,每隔多少轮训练并使用测试集计算和输出一次评测指标 |
verbose | 控制输出信息显示的方式 | |
verbose | 0 | 不在标准输出流输出 |
verbose | 1 | 输出进度条记录 |
verbose | 2 | 每个epoch输出一行记录 |
6.2.5 评估模型
score = model.evaluate(x_test,y_test,batch_size = 32)
6.2.6 使用模型
model.predict(x, batch_size, verbose)