跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 医疗 AI 常用库及案例解析

Python 医疗 AI 领域常用开源库整理,涵盖数据处理、深度学习、大模型及可视化模块。包含 MONAI 医学图像分割、Pandas/Polars 电子病历分析、RDKit 药物分子模拟等实战案例。介绍各库核心功能、安装方式及代码示例,辅助开发者快速构建医疗 AI 应用。

灭霸发布于 2026/2/16更新于 2026/11/794 浏览
Python 医疗 AI 常用库及案例解析

概述

随着人工智能在医疗领域的持续深入发展,Python 已经成为医疗 AI 项目的首选开发语言。从数据处理、模型训练、大模型集成到系统部署与可视化,Python 社区在过去几年中涌现出大量功能强大且持续演进的开源工具。本指南整理了在医疗 AI 项目中广泛使用的 Python 库,涵盖了机器学习、深度学习、大语言模型(LLM)、数据可视化、Web API 构建、Agent 自动化等多个模块。

一、数据科学与机器学习

库名说明
Polars高性能 DataFrame 库,性能远超 Pandas,支持多线程、懒执行。
scikit-learn 1.5+经典 ML 库,持续更新中,新增更多模型评估工具和高阶调参接口。
XGBoost / LightGBM / CatBoost树模型三大王者,依旧是 Kaggle 和工业界主力。
skops用于将 scikit-learn 模型转换为可部署格式的库。
H2O Wave可快速构建 ML Web 应用的库,适合原型展示。

二、深度学习

库名说明
PyTorch 2.2+加入了更完整的 torch.compile 支持,大幅提升训练速度。
Transformers (🤗)Hugging Face 的旗舰库,支持最新 GPT、LLaMA3、Mistral、Gemma 等模型。
Diffusers (🤗)文生图、图生图的标准库。
Keras 3.x完全支持 PyTorch 和 JAX 后端,统一 API,变得更强大。
FastAI 2.8+PyTorch 封装库,便捷构建深度学习模型,教学使用友好。

三、大语言模型 (LLM) 与 RAG

库名说明
LangChain构建 LLM 工作流的库,支持 OpenAI、Anthropic、Claude 等模型调用。
LlamaIndex构建向量索引与检索增强生成(RAG)系统的核心库。
Haystack来自 Deepset 的 RAG 框架,支持多种后端。
InstructorEmbedding微调 embedding 模型,效果比 OpenAI embeddings 更准。
VLLM / TGI / LMDeploy高效部署大模型的库,在企业部署中非常关键。

四、数据可视化

库名说明
Plotly 5.x交互式图表,支持 Jupyter 和 Web,持续流行。
Altair 5+基于 Vega 的声明式可视化工具,支持 Pandas 和 Polars。
PyGWalker类似 Tableau 的数据探索工具。
Seaborn v0.13+经典静态图工具,仍常用。

五、Web 开发 & API

库名说明
FastAPI异步、类型注解友好的 API 框架。
Litestar (前身为 Starlite)FastAPI 替代者,架构更现代、性能更强。
Reflex (前身为 Pynecone)用 Python 写前端和后端,生成完整 Web 应用。
NiceGUI用 Python 写交互式 GUI,基于 Vue + Tailwind,快速开发界面。

六、自动化 & AI Agent

库名说明
Autogen (Microsoft)构建多智能体协作系统,支持代码写作、任务规划等。
CrewAI用 LLM 构建多角色 AI 工作流系统,支持角色分工、任务追踪。
LangGraph基于 LangChain 的图结构 LLM 流程管理库,适合构建复杂逻辑。

七、其他值得关注的工具库

库名说明
Rich / Textual用于终端 UI 的现代化库,支持彩色日志、表格、进度条等。
Pydantic v2类型验证神器,性能提升巨大,广泛用于 FastAPI 和数据校验。
Typer用于构建 CLI 工具的库,语法优美、支持类型注解。
Uvicorn / Gunicorn / Hypercorn常用 Python Web 服务器,支持异步。

练手案例

案例一:医学图像处理与分析

1. MONAI(Medical Open Network for AI)

专为医学影像(CT/MRI)打造的 PyTorch 库。

基本示例:加载并处理 MRI 图像

安装命令:

pip install monai nibabel

下面是一个医学图像处理示例,结合了数据加载、预处理、3D UNet 模型构建和训练流程,使用 MONAI 库实现端到端的医学图像分割任务:

from monai.transforms import (
    LoadImaged, AddChanneld, Spacingd, Orientationd,
    ScaleIntensityRanged, RandCropByPosNegLabeld, Compose, EnsureTyped
)
from monai.networks.nets import UNet
from monai.losses import DiceLoss
from monai.metrics import DiceMetric
from monai.data import Dataset, DataLoader, decollate_batch
from monai.inferers import sliding_window_inference
import torch
import numpy as np
import matplotlib.pyplot as plt

# 1. 数据准备与预处理
data_dir = "./medical_images/"
train_files = [
    {"image": data_dir + "patient1_CT.nii.gz", "label": data_dir + "patient1_mask.nii.gz"},
    {"image": data_dir + "patient2_CT.nii.gz", "label": data_dir + "patient2_mask.nii.gz"}
]

# 医学图像预处理流程
train_transforms = Compose([
    LoadImaged(keys=["image", "label"]),
    AddChanneld(keys=["image", "label"]),
    Spacingd(keys=["image", "label"], pixdim=(1.0, 1.0, 2.0), mode=("bilinear", "nearest")),
    Orientationd(keys=["image", "label"], axcodes="RAS"),
    ScaleIntensityRanged(keys=["image"], a_min=-1000, a_max=1000, b_min=0.0, b_max=1.0, clip=True),
    RandCropByPosNegLabeld(keys=["image", "label"], label_key="label", spatial_size=(96, 96, 64), pos=1, neg=1, num_samples=4),
    EnsureTyped(keys=["image", "label"], dtype=torch.float32)
])

# 创建数据集和数据加载器
train_ds = Dataset(data=train_files, transform=train_transforms)
train_loader = DataLoader(train_ds, batch_size=2, shuffle=True)

# 2. 构建 3D 分割模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = UNet(
    spatial_dims=3, in_channels=1, out_channels=2,
    channels=(16, 32, 64, 128, 256), strides=(2, 2, 2, 2), num_res_units=2
).to(device)

# 3. 设置训练参数
loss_function = DiceLoss(to_onehot_y=True, softmax=True)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
dice_metric = DiceMetric(include_background=False, reduction="mean")

# 4. 训练循环
max_epochs = 50
for epoch in range(max_epochs):
    model.train()
    epoch_loss = 0
    for batch_data in train_loader:
        inputs, labels = batch_data["image"].to(device), batch_data["label"].to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = loss_function(outputs, labels)
        loss.backward()
        optimizer.step()
        epoch_loss += loss.item()
    epoch_loss /= len(train_loader)

    # 验证步骤 (简化版)
    model.eval()
    with torch.no_grad():
        metric_sum = 0.0
        for val_data in train_loader:
            val_images, val_labels = val_data["image"].to(device), val_data["label"].to(device)
            val_outputs = sliding_window_inference(val_images, (96, 96, 64), 4, model)
            val_outputs = [torch.argmax(i, dim=1) for i in decollate_batch(val_outputs)]
            dice_metric(y_pred=val_outputs, y=val_labels)
        metric = dice_metric.aggregate().item()
        dice_metric.reset()
    print(f"Epoch {epoch+1}/{max_epochs}, Loss: {epoch_loss:.4f}, Dice: {metric:.4f}")

# 5. 可视化结果 (示例)
def visualize_slice(image, label, prediction, slice_index=25):
    fig, axes = plt.subplots(1, 3, figsize=(15, 5))
    axes[0].imshow(image[0, 0, :, :, slice_index], cmap="gray")
    axes[0].set_title("Input Image")
    axes[0].axis("off")
    axes[1].imshow(label[0, 0, :, :, slice_index], cmap="jet")
    axes[1].set_title("Ground Truth")
    axes[1].axis("off")
    axes[2].imshow(prediction[0, 0, :, :, slice_index], cmap="jet")
    axes[2].set_title("Prediction")
    axes[2].axis("off")
    plt.show()

# 测试单张图像
test_data = train_ds[0]
image = test_data["image"].unsqueeze(0).to(device)
with torch.no_grad():
    prediction = sliding_window_inference(image, (96, 96, 64), 4, model)
    prediction = torch.argmax(prediction, dim=1, keepdim=True)
    visualize_slice(image.cpu().numpy(), test_data["label"].unsqueeze(0).numpy(), prediction.cpu().numpy())
关键组件说明:
  1. 数据预处理流程:
    • Spacingd:标准化不同扫描仪的分辨率差异
    • Orientationd:统一图像方向(RAS 坐标系)
    • ScaleIntensityRanged:CT 值标准化(-1000 到 1000 HU)
    • RandCropByPosNegLabeld:基于标签的智能裁剪
  2. 3D UNet 架构:专门处理体积数据(如 CT/MRI),残差单元提升梯度流动,多尺度特征提取能力。
  3. 医学图像特定技术:Dice 损失函数处理类别不平衡,Sliding Window 推理处理大尺寸体积数据,体素间距保留保持物理尺寸一致性。
  4. 可视化:三视图对比(原始图像/真实标签/预测结果),多平面重建(轴向/冠状/矢状面)。
实际应用场景:
  1. 器官分割(肝脏/肾脏/肿瘤)
  2. 病变检测
  3. 手术规划
  4. 放射治疗剂量计算
进阶优化建议:
# 添加数据增强
from monai.transforms import RandRotated, RandFlipd, RandZoomd
train_transforms.insert(6, Compose([
    RandRotated(keys=["image", "label"], range_x=0.3, prob=0.5),
    RandFlipd(keys=["image", "label"], spatial_axis=0, prob=0.5),
    RandZoomd(keys=["image", "label"], min_zoom=0.9, max_zoom=1.1, prob=0.5)
]))

# 使用更先进的模型
from monai.networks.nets import SwinUNETR
model = SwinUNETR(img_size=(96, 96, 64), in_channels=1, out_channels=2, feature_size=48).to(device)

# 添加学习率调度
lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=max_epochs)

# 混合精度训练
scaler = torch.cuda.amp.GradScaler()

此示例展示了 MONAI 在医学图像分析中的核心优势:领域特定的预处理、优化的 3D 网络架构、医学影像评估指标和高效的大体积数据处理能力。实际应用中需根据具体临床任务调整网络结构和处理参数。

案例二:电子病历数据分析

2. Pandas + Polars + PyGWalker

快速探索表格型 EHR 数据(如病人记录、药品记录等)。

示例:用 PyGWalker 交互式探索电子病历

安装命令:

pip install pandas polars pygwalker

一个结合 Pandas、Polars 和 PyGWalker 快速探索电子健康记录(EHR)数据的完整示例,包含数据加载、预处理和交互式可视化:

import pandas as pd
import polars as pl
import pygwalker as pyg
from datetime import datetime

# 示例 EHR 数据结构 (若需加载真实数据,替换为 read_csv/read_parquet)
data = {
    "patient_id": [1001, 1002, 1003, 1001, 1004],
    "visit_date": ["2023-01-15", "2023-02-20", "2023-01-05", "2023-03-10", "2023-02-28"],
    "diagnosis": ["Hypertension", "Diabetes", "Hypertension", "Asthma", "Diabetes"],
    "medication": ["Lisinopril", "Metformin", "Amlodipine", "Albuterol", "Insulin"],
    "age": [45, 62, 58, 36, 70],
    "blood_pressure": ["140/90", "130/85", "150/95", "120/80", "145/88"],
    "lab_result": [None, 6.5, 7.1, None, 8.0]
}

# 方案 1: 使用 Pandas 加载数据
df_pd = pd.DataFrame(data)
df_pd["visit_date"] = pd.to_datetime(df_pd["visit_date"])

# 方案 2: 使用 Polars 加载大数据(更高效)
df_pl = pl.DataFrame(data).with_columns(pl.col("visit_date").str.to_date("%Y-%m-%d"))

# 转换为 Pandas 供 PyGWalker 使用(Polars 处理+PyGWalker 可视化)
df_processed = df_pl.to_pandas()

# 使用 PyGWalker 进行交互式分析
walker = pyg.walk(
    df_processed,
    spec="./ehr_analysis.json",
    dark="light",
    show_cloud_tool=False,
    field_specs={
        "age": {"analyticType": "dimension"},
        "lab_result": {"analyticType": "measure"}
    }
)
关键功能说明:
  • 小数据:直接使用 pd.read_csv("ehr.csv")
  • 大数据:用 Polars 加速处理 → 转 Pandas
  • PyGWalker 交互技巧:拖拽分析(字段拖到 X/Y 轴、颜色、大小等通道),图表推荐(智能识别字段类型推荐图表),一键生成(患者年龄分布直方图、疾病类型环形图、实验室指标趋势线、多指标散点矩阵)。
高级分析支持:
# 在 PyGWalker 界面中直接使用 Pandas 语法
walker.set_global_query("""
systolic = blood_pressure.split('/')[0].astype(int)
diastolic = blood_pressure.split('/')[1].astype(int)
hypertension_flag = (systolic >= 140) | (diastolic >= 90)
""")
数据加载优化:
df_pl = pl.scan_parquet("large_ehr.parquet").collect()
典型工作流:
  1. 数据加载:Polars 处理百万级记录(比 Pandas 快 5-10 倍)
  2. 预处理:在 Polars 中完成清洗/转换
  3. 交互探索:拖拽字段自动生成图表,多维度对比
优势场景:
场景PandasPolarsPyGWalker
数据加载速度★★☆★★★-
内存效率★★☆★★★-
交互式可视化--★★★
复杂分析支持★★★★★★★★☆

提示:对于超大数据集(>1GB),推荐使用 Polars 惰性加载。

案例三:药物发现与分子模拟

3. RDKit

用于化合物表示、分子指纹计算、QSAR 模型等。

示例:分子指纹和相似度

安装命令:(推荐用 conda 安装)

conda install -c rdkit rdkit

使用 RDKit 计算分子指纹和相似度的完整示例代码,并附带详细解释:

from rdkit import Chem
from rdkit.Chem import AllChem, DataStructs
from rdkit.Chem.Draw import MolsToGridImage
import matplotlib.pyplot as plt

# 1. 分子创建与可视化
ethanol = Chem.MolFromSmiles("CCO")  # 乙醇
ethylamine = Chem.MolFromSmiles("CCN")  # 乙胺

# 可视化分子
img = MolsToGridImage([ethanol, ethylamine], legends=["Ethanol (CCO)", "Ethylamine (CCN)"], subImgSize=(300, 300))
plt.imshow(img)
plt.axis('off')
plt.show()

# 2. 分子指纹生成
# 使用 Morgan 指纹算法(圆形指纹),半径=2,生成 2048 位的位向量
fp_ethanol = AllChem.GetMorganFingerprintAsBitVect(ethanol, radius=2, nBits=2048)
fp_ethylamine = AllChem.GetMorganFingerprintAsBitVect(ethylamine, radius=2, nBits=2048)

# 3. 相似度计算
# 计算 Tanimoto 系数(Jaccard 相似度)
similarity = DataStructs.TanimotoSimilarity(fp_ethanol, fp_ethylamine)

# 4. 结果输出
print("=" * 50)
print(f"Tanimoto Similarity: {similarity:.4f}")
print("=" * 50)
print("Interpretation:")
print(f"- Ethanol (CCO) and Ethylamine (CCN) are {similarity*100:.1f}% similar")
print("- Similarity range: 0.0 (完全不同) to 1.0 (完全相同)")
print("- Value >0.5 suggests significant structural similarity")
print("- Difference due to terminal group: -OH vs -NH₂")
代码解析:
  1. 分子创建:
    • MolFromSmiles() 将 SMILES 字符串转换为分子对象
    • 乙醇:CCO(羟基化合物)
    • 乙胺:CCN(胺类化合物)
  2. 分子指纹:
    • 使用 Morgan 指纹算法(圆形指纹)
    • radius=2:考虑原子周围两键范围内的结构特征
    • nBits=2048:生成 2048 位的二进制指纹向量
    • 算法原理:通过迭代扩展识别每个原子周围的独特子结构
  3. 相似度计算:
    • Tanimoto 系数 = 共有特征数 / (特征 A 总数 + 特征 B 总数 - 共有特征数)
    • 数学表示:T(A,B) = |A∩B| / (|A| + |B| - |A∩B|)
    • 取值范围:0.0(完全不同)到 1.0(完全相同)
  4. 结果解释:
    • 典型输出:Tanimoto Similarity: 0.25-0.35
    • 相似度约 30%:两个分子有相同的乙基骨架(-CH₂-CH₃),但不同末端基团(-OH vs -NH₂)
    • 在药物发现中:
      • 0.3-0.7:中等相似
      • <0.2:结构差异大
      • 0.85:高度相似化合物
应用场景:
  1. 虚拟筛选:快速筛选大型化合物数据库
  2. 先导化合物优化:评估结构修饰后的相似性变化
  3. 聚类分析:对化合物库进行结构分组
  4. ADMET 预测:基于相似性的性质预测
扩展建议:
# 尝试不同分子对
aspirin = Chem.MolFromSmiles("CC(=O)OC1=CC=CC=C1C(=O)O")
ibuprofen = Chem.MolFromSmiles("CC(C)CC1=CC=C(C=C1)C(C)C(=O)O")

# 比较不同指纹算法
fp1 = AllChem.GetMACCSKeysFingerprint(mol)  # MACCS 密钥
fp2 = Chem.RDKFingerprint(mol)  # RDKit 拓扑指纹

注意事项:相似度值高度依赖指纹参数(半径、位长度)。结构相似 ≠ 活性相似(需结合生物实验验证)。对小分子效果最佳(分子量 < 800 Da)。

运行此代码需要预先安装 RDKit(建议通过 Anaconda 安装):

conda install -c conda-forge rdkit matplotlib

目录

  1. 概述
  2. 一、数据科学与机器学习
  3. 二、深度学习
  4. 三、大语言模型 (LLM) 与 RAG
  5. 四、数据可视化
  6. 五、Web 开发 & API
  7. 六、自动化 & AI Agent
  8. 七、其他值得关注的工具库
  9. 练手案例
  10. 案例一:医学图像处理与分析
  11. 1. MONAI(Medical Open Network for AI)
  12. 1. 数据准备与预处理
  13. 医学图像预处理流程
  14. 创建数据集和数据加载器
  15. 2. 构建 3D 分割模型
  16. 3. 设置训练参数
  17. 4. 训练循环
  18. 5. 可视化结果 (示例)
  19. 测试单张图像
  20. 关键组件说明:
  21. 实际应用场景:
  22. 进阶优化建议:
  23. 添加数据增强
  24. 使用更先进的模型
  25. 添加学习率调度
  26. 混合精度训练
  27. 案例二:电子病历数据分析
  28. 2. Pandas + Polars + PyGWalker
  29. 示例 EHR 数据结构 (若需加载真实数据,替换为 readcsv/readparquet)
  30. 方案 1: 使用 Pandas 加载数据
  31. 方案 2: 使用 Polars 加载大数据(更高效)
  32. 转换为 Pandas 供 PyGWalker 使用(Polars 处理+PyGWalker 可视化)
  33. 使用 PyGWalker 进行交互式分析
  34. 关键功能说明:
  35. 高级分析支持:
  36. 在 PyGWalker 界面中直接使用 Pandas 语法
  37. 数据加载优化:
  38. 典型工作流:
  39. 优势场景:
  40. 案例三:药物发现与分子模拟
  41. 3. RDKit
  42. 1. 分子创建与可视化
  43. 可视化分子
  44. 2. 分子指纹生成
  45. 使用 Morgan 指纹算法(圆形指纹),半径=2,生成 2048 位的位向量
  46. 3. 相似度计算
  47. 计算 Tanimoto 系数(Jaccard 相似度)
  48. 4. 结果输出
  49. 代码解析:
  50. 应用场景:
  51. 扩展建议:
  52. 尝试不同分子对
  53. 比较不同指纹算法

更多推荐文章

查看全部
  • Python+Agent 入门实战:搭建可复用 AI 智能体
  • 新手必看!ClaudeCode+Figma-MCP 前端代码 1:1 还原 UI 的入门指南
  • 小米 MiLoco 大模型智能家居部署指南
  • 基于 Rokid AR 眼镜的健康饮水提醒应用开发
  • AI 绘画平民化:开源镜像 + 千元显卡运行 Z-Image-Turbo 部署指南
  • 字节跳动交易与广告前端一面面经解析
  • Claude Code 高级编程技巧实战项目详解
  • 前端如何实现记住密码功能
  • 基于Llama-Factory微调数学解题模型与思维链优化
  • 美团 EvoCUA 刷新开源 SOTA:具备持续进化能力的计算机操作智能体
  • 宜搭低代码高级认证实操:待办列表功能实现
  • 基于 Augment Code 与 Axure 自动生成前端代码实践
  • 豆包 API 注册与密钥申请流程
  • Java 多线程与并发核心机制详解
  • 前端监控最佳实践
  • 开源知识库 RAGFlow 从部署到实战操作详解
  • 受限环境中基于 Copilot API 构建 ReAct MCP Agent
  • 利用 NAS 部署智能家居网关实现全屋智能控制
  • C++ 异常处理机制:异常捕获、自定义异常与实战应用
  • 使用 LLaMA-Factory 微调 Qwen3 模型流程与评估

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online