Jupyter notebook调试:设置断点运行
写了一段小代码,主要是用来测试一段序列的k均值聚类效果;
中间想到debug一下,但是想到自己似乎从来没有正式地接触过jupyter notebook中地debug,平时也只是多开几个cell,然后在其他cell中复制粘贴部分代码,一步一步运行,然后进行print()大法查看变量和数据结构。
import numpy as np
from sklearn.cluster import KMeans
window_size = 3
features = [] #每一个窗口的012显状态的频率
obs_labels = [] #每一个窗口中心位置的显状态标签n_states=3 # 隐状态数
n_observations=3 # 显状态数seq = "MEGDAVEAIVEESETFIKGKERKTYQRRREGGQEEDACHLPQNQTDGGEVVQDVNSSVQMVMMEQLDPTLLQMKTEVMEGTVAPEAEAAVDDTQIITLQVVNMEEQPINIGELQLVQVPVPVTVPVATTSVEELQGAYENEVSKEGLAESEPMICHTLPLPEGFQVVKVGANGEVETLEQGELPPQEDPSWQKDPDYQPPAKKTKKTKKSKLRYTEEGKDVDVSVYDFEEEQQEGLLSEVNAEKVVGNMKPPKPTKIKKKGVKKTFQCELCSYTCPRRSNLDRHMKSHTDERPHKCHLCGRAFRTVTLLRNHLNTHTGTRPHKCPDCDMAFVTSGELVRHRRYKHTHEKPFKCSMCDYASVEVSKLKRHIRSHTGERPFQCSLCSYASRDTYKLKRHMRTHSGEKPYECYICHARFTQSGTMKMHILQKHTENVAKFHCPHCDTVIARKSDLGVHLRKQHSYIEQGKKCRYCDAVFHERYALIQHQKSHKNEKRFKCDQCDYACRQERHMIMHKRTHTGEKPYACSHCDKTFRQKQLLDMHFKRYHDPNFVPAAFVCSKCGKTFTRRNTMARHADNCAGPDGVEGENGGETKKSKRGRKRKMRSKKEDSSDSENAEPDLDDNEDEEEPAVEIEPEPEPQPVTPAPPPAKKRRGRPPGRTNQPKQNQPTAIIQVEDQNTGAIENIIVEVKKEPDAEPAEGEEEEAQPAATDAPNGDLTPEMILSMMDR"
seq_encoded = [ [0 if i in ["K","R","H"] else (1 if i in ["D","E"] else 2) ] for i in seq ]
for i in range(len(seq_encoded) - window_size + 1):window = seq_encoded[i:i+window_size]feature = np.zeros(n_observations)for obs in window:feature[obs[0]] += 1 # 计算0、1、2显状态频数feature /= window_size # 归一化features.append(feature)obs_labels.append(seq_encoded[i+window_size//2]) # 记录中心位置的显状态标签features,obs_labels = np.array(features),np.array(obs_labels)# 使用K-means聚类
kmeans = KMeans(n_clusters=n_observations,random_state=2025)
cluster_labels = kmeans.fit_predict(features) #fit+predict# 统计每个簇对应的观测分布
emission_counts = np.ones((n_states,n_observations)) # 拉普拉斯平滑for cluster_id in range(n_states):cluster_mask = (cluster_labels == cluster_id) # 获取当前簇的掩码,如果是当前簇的样本则为Truecluster_obs = obs_labels[cluster_mask] #取出对应cluster id的观测标签for obs in cluster_obs:emission_counts[cluster_id,obs] += 1 # 对于每一个cluster_id是隐状态,obs是显状态,进行计数
# 归一化
emission_counts /= emission_counts.sum(axis=1, keepdims=True) # 按行归一化
# 输出每个簇的观测分布
for i in range(n_states):print(f"Cluster {i} emission distribution: {emission_counts[i]}")
就拿最基本的断点操作来举例,比如说我只想运行代码到第22行,然后简单查看一下features,obs_labels的变量值。
如果是以前刚入门的我,可能就是直接另外开一个cell,然后把这前面22行代码直接复制粘贴,然后单独运行,运行之后再一步一步print,太low了。
一,现在来介绍一个调试的库pdb:
jupyter的调试是通过python自带的pdb库来实现的。
首先是你的每个cell的code前面,加两句
import pdb
pdb.set_trace() # 调试用,断点调试
然后我们手头上的代码直接运行:
ctrl+enter
运行之后可以看到弹出的调试命令行框:
一些最基本的调试命令参数:
完整命令 | 简写命令 | 描述 |
---|---|---|
args | a | 打印当前函数的参数 |
break | b | 设置断点 |
clear | cl | 清除断点 |
condition | 无 | 设置条件断点 |
continue | c或者cont | 继续运行,知道遇到断点或者脚本结束 |
disable | 无 | 禁用断点 |
enable | 无 | 启用断点 |
help | h | 查看pdb帮助 |
ignore | 无 | 忽略断点 |
jump | j | 跳转到指定行数运行 |
list | l | 列出脚本清单 |
next | n | 执行下条语句,遇到函数不进入其内部 |
p | p | 打印变量值,也可以用print |
quit | q | 退出 pdb |
return | r | 一直运行到函数返回 |
tbreak | 无 | 设置临时断点,断点只中断一次 |
step | s | 执行下一条语句,遇到函数进入其内部 |
where | w | 查看所在的位置 |
! | 无 | 在pdb中执行语句 |
比如说我想在这里的第26行设置一个断点:
我们输入:
b 26
在输入b 26之后:对比前面
比如说我现在想看一下features变量的值,我直接在输入框中输入features,或者print(features),同样我可以看一下shape:
查看另外一个变量:
看shape,是一维array:
如果输出调试信息太多了,可以clear cell的output;
调试完毕之后可以直接q退出。
二,jupyter本身也开发了相应的可视化debug工具
debugger
参考:https://zhuanlan.zhihu.com/p/120215615
参考:https://blog.csdn.net/weixin_41529093/article/details/117535034