当前位置: 首页 > backend >正文

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

运行之后可以看到弹出的调试命令行框:

一些最基本的调试命令参数:

完整命令简写命令描述
argsa打印当前函数的参数
breakb设置断点
clearcl清除断点
condition设置条件断点
continuec或者cont继续运行,知道遇到断点或者脚本结束
disable禁用断点
enable启用断点
helph查看pdb帮助
ignore忽略断点
jumpj跳转到指定行数运行
listl列出脚本清单
nextn执行下条语句,遇到函数不进入其内部
pp打印变量值,也可以用print
quitq退出 pdb
returnr一直运行到函数返回
tbreak设置临时断点,断点只中断一次
steps执行下一条语句,遇到函数进入其内部
wherew查看所在的位置
!在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

http://www.xdnf.cn/news/14628.html

相关文章:

  • Kubernetes 集群性能优化实战:从资源分配到调度策略
  • `teleport` 传送 API 的使用:在 Vue 3 中的最佳实践
  • 为WIN10微软输入法的全角切换Bug禁用Shift+Space组合键
  • C++ unordered_set基础概念、对象创建、赋值操作、数据插入、数据删除、代码练习 1 2
  • 前端开发面试题总结-vue3框架篇(二)
  • 《map和set的使用介绍》
  • stm32串口(uart)2转发到串口(uart)3实现
  • Qt实战:自定义二级选项框 | 附完整源码
  • 为车辆提供路径规划解决方案:技术演进、挑战与未来蓝图
  • 网络编程及原理(六):三次握手、四次挥手
  • 【软考高级系统架构论文】论NoSQL数据库技术及其应用
  • 通过事件过滤器拦截QRadioButton点击事件
  • 算法第38天|322.零钱兑换\139. 单词拆分
  • 数据分析和可视化:Py爬虫-XPath解析章节要点总结
  • 【Python进阶系列】第9篇:聊聊 Python 中常用的第三方库
  • C++递归应用
  • 7.3.1二叉排序树
  • 【编译原理】语句的翻译
  • FPGA基础 -- Verilog 共享任务(task)和函数(function)
  • VUE3 Element UI el-button type icon
  • King’s LIMS 系统引领汽车检测实验室数字化转型
  • QT历史版本,5.15.2使用清华源半小时安装速成
  • GitHub Actions + SSH 自动部署教程
  • 日常运维问题汇总-24
  • 分清display三个属性
  • MySQL之事务深度解析
  • 为什么你的vue项目连接不到后端
  • 基于微信小程序的美食点餐订餐系统
  • JSON 数据格式详解
  • SEO已死,GEO当立:AI搜索时代的新游戏规则