数学建模竞赛Python速成:NumPy、Pandas、Matplotlib核心实战指南

📅 2026/8/12 18:00:48
数学建模竞赛Python速成:NumPy、Pandas、Matplotlib核心实战指南
如果你正在准备数学建模竞赛打开Python教程却不知从何下手如果你面对海量的数据处理、复杂的模型构建和可视化需求感到无从入手如果你希望在短时间内不是“学会Python”而是“能用Python解决数学建模问题”——那么这篇文章就是为你写的。数学建模竞赛的核心从来不是比拼谁的Python语法更熟练而是谁能更快地将一个数学思想转化为可运行、可验证的代码并产出清晰的分析图表。传统的Python教程往往从“Hello World”讲起等你学到NumPy时比赛可能已经结束了。本文采取完全不同的路径我们将直接切入数学建模最核心的三大库——NumPy、Pandas和Matplotlib通过“任务驱动”的方式让你在1小时内建立起解决80%建模问题的代码能力框架。我们的目标非常明确忘掉语法细节聚焦于“在建模中这个库能帮我做什么以及我该如何调用它”。本文不会让你成为Python专家但能确保你在看到赛题后能迅速找到对应的代码模块进行数据操作、模型计算和结果呈现。无论是国赛、美赛还是其他各类数模竞赛这套以NumPy、Pandas、Matplotlib为核心的“黄金三角”组合都是你最高效的武器库。1. 为什么是NumPy、Pandas和Matplotlib——数学建模的“代码最小集”在开始写第一行代码之前我们必须建立一个清晰的认知数学建模的编程工作可以高度抽象为三个环节数值计算与矩阵操作这是模型的核心涉及线性代数、微积分、优化算法等。NumPy提供了高效的N维数组对象和丰富的数学函数是执行这些计算的基石。数据清洗、整合与管理赛题数据往往是混乱的CSV或Excel文件。Pandas提供了DataFrame这一数据结构能像操作Excel表格一样进行筛选、合并、分组、聚合将原始数据快速整理为模型可用的格式。结果可视化与分析“一图胜千言”。无论是趋势图、分布图、关系图还是地理信息图Matplotlib及其更高级的接口如Seaborn能帮你将复杂的模型结果直观地呈现出来这是论文拿高分的关键。一个常见的误区是花费大量时间学习Python基础语法如循环、条件判断却对这三个库一知半解。实际上在建模中90%的“循环”操作都可以被NumPy的向量化计算或Pandas的内置函数所替代其效率高出成百上千倍。因此我们的学习策略是“用20%的Python基础语法去驱动80%的三大库核心功能”。接下来我们将以“环境准备-核心概念-实战代码-常见问题”为主线带你快速通关。2. 环境准备10分钟搭建你的建模工作台你不需要复杂的IDE。对于快速学习和竞赛实战我们推荐使用Anaconda Jupyter Notebook的组合。Anaconda是一个集成了Python、科学计算库和包管理工具的平台能一键解决环境依赖问题Jupyter Notebook则允许你以“单元格”的形式编写和运行代码并即时看到结果和图表非常适合探索性数据分析。2.1 安装Anaconda访问Anaconda官网https://www.anaconda.com/products/distribution下载对应你操作系统Windows/macOS/Linux的Python 3.x版本安装包。按照安装向导进行安装。在Windows上务必勾选“Add Anaconda to my PATH environment variable”将Anaconda添加到系统路径这可以避免后续在命令行中找不到conda命令的麻烦。2.2 验证安装与启动Jupyter安装完成后打开“Anaconda Prompt”Windows或终端macOS/Linux。# 验证Python和conda已安装 python --version conda --version # 启动Jupyter Notebook jupyter notebook执行jupyter notebook后你的默认浏览器会自动打开一个本地页面这就是你的工作台。点击右上角“New” - “Python 3”即可创建一个新的Notebook文件开始你的代码之旅。重要提示本文所有代码示例均可在Jupyter Notebook的单元格中直接运行并看到结果。3. NumPy速成让数学计算飞起来NumPy的核心是ndarrayN维数组对象。你可以把它想象成一个超级强大的“数学表格”能够对整个表格进行快速的加减乘除、函数运算而无需写循环。3.1 核心操作创建、索引与计算首先在Notebook的第一个单元格中导入NumPy并约定俗成地将其重命名为np。import numpy as np1. 创建数组# 从列表创建一维、二维数组 arr1 np.array([1, 2, 3, 4, 5]) arr2 np.array([[1, 2, 3], [4, 5, 6]]) # 2行3列的矩阵 # 创建特殊数组零矩阵、单位矩阵、等差数列 zeros np.zeros((3, 4)) # 3行4列的全0矩阵 ones np.ones((2, 2)) # 2行2列的全1矩阵 eye np.eye(3) # 3阶单位矩阵 range_arr np.arange(0, 10, 2) # [0, 2, 4, 6, 8]类似range() linspace_arr np.linspace(0, 1, 5) # [0., 0.25, 0.5, 0.75, 1.]等间隔5个数2. 数组索引与切片非常重要arr np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]]) print(原始数组:\n, arr) print(获取第一行:, arr[0]) # [10 20 30] print(获取第二行第二列的元素:, arr[1, 1]) # 50 print(切片前两行后两列:\n, arr[:2, 1:]) # [[20 30], [50 60]] print(布尔索引获取大于50的元素:, arr[arr 50]) # [60 70 80 90]3. 向量化计算与广播这是NumPy的精华也是提升代码效率的关键。a np.array([1, 2, 3]) b np.array([4, 5, 6]) # 元素级运算无需循环 print(加法:, a b) # [5 7 9] print(乘法:, a * b) # [4 10 18] print(平方:, a ** 2) # [1 4 9] print(三角函数:, np.sin(a)) # 对每个元素求sin # 广播机制当数组形状不同时NumPy会尝试自动扩展 matrix np.ones((3, 3)) # 3x3全1矩阵 row_vector np.array([1, 2, 3]) # 1x3行向量 # 矩阵的每一行都加上这个行向量 result matrix row_vector print(广播加法结果:\n, result) # [[2. 3. 4.] # [2. 3. 4.] # [2. 3. 4.]]3.2 数学建模常用函数记住下面这些函数能解决建模中大部分计算问题。# 1. 线性代数 A np.array([[1, 2], [3, 4]]) B np.array([[5, 6], [7, 8]]) print(矩阵乘法:\n, np.dot(A, B)) # 或 A B (Python 3.5) print(矩阵转置:\n, A.T) print(求逆矩阵:\n, np.linalg.inv(A)) # 用于解线性方程组 AX B print(求行列式:, np.linalg.det(A)) print(求特征值和特征向量:, np.linalg.eig(A)) # 2. 统计与聚合 data np.array([[1, 2, 3], [4, 5, 6]]) print(整个数组的和:, np.sum(data)) print(沿列求和每行的和:, np.sum(data, axis1)) # axis0沿行axis1沿列 print(平均值:, np.mean(data)) print(标准差:, np.std(data)) print(最大值/最小值:, np.max(data), np.min(data)) print(最大值索引:, np.argmax(data)) # 扁平化后的索引 # 3. 随机数生成模拟、蒙特卡洛方法必备 np.random.seed(42) # 设置随机种子确保结果可复现 print(10个[0,1)的均匀分布随机数:, np.random.rand(10)) print(标准正态分布随机数:, np.random.randn(5, 2)) # 5行2列 print(从给定列表随机选择:, np.random.choice([A, B, C], size5))NumPy核心思想尽可能将数据放入ndarray然后用内置函数对整个数组进行操作避免使用Python原生的for循环。这不仅是代码简洁的问题更是性能相差数百倍的关键。4. Pandas速成像操作Excel一样玩转数据如果说NumPy是“计算引擎”那么Pandas就是“数据管家”。它的核心是两种数据结构Series一维带标签数组和DataFrame二维表格可理解为增强版的Excel工作表。建模中的数据预处理90%的工作都在与DataFrame打交道。4.1 DataFrame的创建与查看import pandas as pd # 从字典创建最常用 data { 姓名: [张三, 李四, 王五], 年龄: [22, 25, 30], 成绩: [85, 92, 78], 城市: [北京, 上海, 广州] } df pd.DataFrame(data) print(创建的DataFrame:) print(df) print(\n查看前2行:) print(df.head(2)) print(\n查看基本信息行数、列数、类型等:) print(df.info()) print(\n查看统计摘要仅数值列:) print(df.describe())4.2 数据索引、筛选与清洗这是数据预处理的灵魂。# 1. 选择列 print(选择‘姓名’列:, df[姓名]) # 返回Series print(选择多列:, df[[姓名, 成绩]]) # 返回DataFrame # 2. 选择行 print(通过标签索引选择前两行:\n, df.iloc[:2]) # 基于位置的索引 print(通过条件筛选成绩大于80:\n, df[df[成绩] 80]) # 3. 处理缺失值真实数据常有 df_with_na df.copy() df_with_na.loc[1, 成绩] None # 模拟一个缺失值 print(原始数据含缺失:\n, df_with_na) print(删除含有缺失值的行:\n, df_with_na.dropna()) print(用均值填充缺失值:) df_filled df_with_na.fillna(df_with_na[成绩].mean()) print(df_filled) # 4. 处理重复值 df_dup pd.DataFrame({A: [1, 1, 2, 2], B: [a, a, b, b]}) print(删除重复行:\n, df_dup.drop_duplicates())4.3 数据变形与聚合GroupBy这是从数据中提取信息的关键。# 1. 分组聚合计算每个城市的平均年龄和最高成绩 grouped df.groupby(城市).agg({ 年龄: mean, 成绩: max }).reset_index() # reset_index将分组键‘城市’重新变为列 print(分组聚合结果:\n, grouped) # 2. 数据合并类似SQL的JOIN df2 pd.DataFrame({ 城市: [北京, 上海, 深圳], GDP万亿: [4.0, 4.3, 3.2] }) merged_df pd.merge(df, df2, on城市, howleft) # 左连接 print(合并后的数据:\n, merged_df) # 3. 数据透视表多维分析 # 假设我们有一个销售数据 sales pd.DataFrame({ 日期: pd.date_range(2023-01-01, periods6, freqD), 产品: [A, B, A, B, A, B], 地区: [North, North, South, South, North, South], 销售额: [100, 150, 200, 120, 130, 180] }) pivot sales.pivot_table(values销售额, index地区, columns产品, aggfuncsum) print(数据透视表各地区各产品总销售额:\n, pivot)Pandas核心思想将数据加载为DataFrame后你的所有操作筛选、计算、分组、合并都应尽量使用Pandas提供的高级接口而不是自己写循环。groupby和pivot_table是你从数据中发现规律的最强武器。5. Matplotlib速成画出让人眼前一亮的图表模型结果再好也需要直观的展示。Matplotlib是绘图的基础库虽然API稍显底层但功能强大且灵活。我们通常结合pyplot模块进行快速绘图。5.1 基础绘图折线图、散点图、柱状图import matplotlib.pyplot as plt # 让图表在Notebook内显示 %matplotlib inline # 准备数据 x np.linspace(0, 10, 100) y1 np.sin(x) y2 np.cos(x) # 1. 创建画布和子图 fig, axes plt.subplots(2, 2, figsize(12, 8)) # 2行2列共4个子图 # 2. 在第一个子图绘制折线图 axes[0, 0].plot(x, y1, colorblue, linewidth2, linestyle-, labelsin(x)) axes[0, 0].plot(x, y2, colorred, linewidth2, linestyle--, labelcos(x)) axes[0, 0].set_title(正弦与余弦曲线) axes[0, 0].set_xlabel(X轴) axes[0, 0].set_ylabel(Y轴) axes[0, 0].legend() # 显示图例 axes[0, 0].grid(True, linestyle:) # 添加网格 # 3. 在第二个子图绘制散点图带噪声 x_scatter np.random.rand(50) * 10 y_scatter x_scatter * 2 np.random.randn(50) * 2 # y 2x 噪声 axes[0, 1].scatter(x_scatter, y_scatter, alpha0.6, edgecolorsblack) axes[0, 1].set_title(带噪声的线性关系散点图) axes[0, 1].set_xlabel(自变量) axes[0, 1].set_ylabel(因变量) # 4. 在第三个子图绘制柱状图 categories [A类, B类, C类, D类] values [23, 45, 56, 12] axes[1, 0].bar(categories, values, color[skyblue, lightgreen, salmon, gold]) axes[1, 0].set_title(各类别数量柱状图) axes[1, 0].set_ylabel(数量) # 在柱子上方添加数值标签 for i, v in enumerate(values): axes[1, 0].text(i, v 1, str(v), hacenter) # 5. 在第四个子图绘制直方图分布图 data_hist np.random.randn(1000) # 1000个标准正态分布随机数 axes[1, 1].hist(data_hist, bins30, edgecolorblack, alpha0.7) axes[1, 1].set_title(数据分布直方图) axes[1, 1].set_xlabel(数值) axes[1, 1].set_ylabel(频数) # 6. 自动调整子图布局并显示 plt.tight_layout() plt.show()5.2 高级技巧样式美化与多图组合论文中的图表需要美观和专业。# 使用更美观的样式 plt.style.use(seaborn-v0_8-darkgrid) # 尝试 ggplot, seaborn, fivethirtyeight # 绘制一个综合图包含主图、子图和注释 fig plt.figure(figsize(10, 6)) # 主图函数曲线及填充 x np.linspace(0, 2*np.pi, 200) y_main np.sin(x) * np.exp(-0.1*x) plt.plot(x, y_main, b-, linewidth2, labely sin(x) * exp(-0.1x)) plt.fill_between(x, y_main, alpha0.2) # 填充曲线下方区域 plt.xlabel(时间 (t), fontsize12) plt.ylabel(振幅 (A), fontsize12) plt.title(阻尼振荡曲线及其频谱分析, fontsize14, fontweightbold) plt.legend(locupper right) plt.grid(True, alpha0.3) # 在图中插入一个子图放大局部 ax_inset fig.add_axes([0.2, 0.5, 0.3, 0.3]) # [左 下 宽 高]相对于整个图的比例 ax_inset.plot(x[80:120], y_main[80:120], r-, linewidth1.5) ax_inset.set_title(局部放大, fontsize9) ax_inset.set_xticks([]) ax_inset.set_yticks([]) ax_inset.grid(True, alpha0.5) # 添加文本注释 plt.annotate(峰值点, xy(np.pi/2, np.exp(-0.1*np.pi/2)), # 注释点坐标 xytext(np.pi/21, 0.8), # 文本坐标 arrowpropsdict(facecolorblack, shrink0.05, width1, headwidth8), fontsize10) plt.tight_layout() plt.show()Matplotlib核心思想绘图遵循“创建画布/子图 - 在对应坐标轴上绘制数据 - 设置标题、标签、图例等属性 - 显示或保存”的流程。多使用plt.subplots()来管理多个图表并善用plt.style来快速应用美观的样式。6. 实战演练一个完整的数学建模代码流程现在我们将三大库串联起来模拟一个完整的、简化的建模流程“分析某城市共享单车使用量与天气的关系”。# 第1步导入所有必要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline plt.style.use(seaborn-v0_8-whitegrid) # 第2步模拟/加载数据比赛中通常是读取CSV文件 # 假设我们通过Pandas模拟了10天的数据 np.random.seed(2023) days 10 dates pd.date_range(2023-10-01, periodsdays, freqD) # 模拟数据温度(°C)、湿度(%)、风速(级)、是否为周末、单车使用量(次) data { 日期: dates, 温度: np.random.randint(15, 30, days), 湿度: np.random.randint(40, 90, days), 风速: np.round(np.random.rand(days) * 4 1, 1), # 1-5级 是否周末: [1, 0, 0, 0, 0, 1, 1, 0, 0, 0], # 1是0否 单车使用量: np.random.randint(800, 2000, days) } df pd.DataFrame(data) print(原始数据预览:) print(df) print(\n数据基本信息:) print(df.info()) # 第3步数据清洗与探索性分析使用Pandas # 检查缺失值 print(\n缺失值统计:) print(df.isnull().sum()) # 计算相关系数矩阵初步看关系 corr_matrix df[[温度, 湿度, 风速, 是否周末, 单车使用量]].corr() print(\n变量间相关系数矩阵:) print(corr_matrix) # 第4步数据可视化寻找直观规律使用Matplotlib fig, axes plt.subplots(2, 2, figsize(14, 10)) # 子图1单车使用量随时间变化 axes[0, 0].plot(df[日期], df[单车使用量], markero, linewidth2) axes[0, 0].set_title(单车日使用量趋势, fontsize12) axes[0, 0].set_xlabel(日期) axes[0, 0].set_ylabel(使用量次) axes[0, 0].tick_params(axisx, rotation45) axes[0, 0].grid(True, alpha0.3) # 子图2温度与使用量的散点图 scatter axes[0, 1].scatter(df[温度], df[单车使用量], cdf[湿度], cmapviridis, sdf[风速]*50, alpha0.7) axes[0, 1].set_title(温度、湿度、风速与使用量关系, fontsize12) axes[0, 1].set_xlabel(温度 (°C)) axes[0, 1].set_ylabel(使用量次) plt.colorbar(scatter, axaxes[0, 1], label湿度 (%)) # 手动添加图例说明风速因为散点大小代表风速 for ws in [1.0, 3.0, 5.0]: axes[0, 1].scatter([], [], cgray, sws*50, alpha0.7, labelf风速 {ws}级) axes[0, 1].legend(title风速, locupper left, fontsize8) # 子图3周末 vs 工作日平均使用量对比柱状图 weekend_avg df.groupby(是否周末)[单车使用量].mean() axes[1, 0].bar([工作日, 周末], weekend_avg.values, color[steelblue, coral]) axes[1, 0].set_title(工作日与周末平均使用量对比, fontsize12) axes[1, 0].set_ylabel(平均使用量次) for i, v in enumerate(weekend_avg.values): axes[1, 0].text(i, v 20, f{v:.0f}, hacenter, fontweightbold) # 子图4使用量分布直方图 axes[1, 1].hist(df[单车使用量], bins6, edgecolorblack, alpha0.7, colorlightgreen) axes[1, 1].axvline(df[单车使用量].mean(), colorred, linestyle--, linewidth2, labelf均值: {df[单车使用量].mean():.0f}) axes[1, 1].set_title(单车使用量分布, fontsize12) axes[1, 1].set_xlabel(使用量次) axes[1, 1].set_ylabel(天数) axes[1, 1].legend() plt.suptitle(共享单车使用情况初步分析, fontsize16, fontweightbold) plt.tight_layout() plt.show() # 第5步简单的模型计算使用NumPy # 假设我们想用多元线性回归此处仅演示最小二乘法公式计算实际可用sklearn print(\n--- 基于NumPy的简单线性回归演示 ---) # 特征矩阵X添加常数项截距 X df[[温度, 是否周末]].values X np.column_stack((np.ones(len(X)), X)) # 添加一列1 # 目标变量y y df[单车使用量].values.reshape(-1, 1) # 使用正规方程求解权重 w (X^T X)^{-1} X^T y try: XTX_inv np.linalg.inv(X.T X) w XTX_inv X.T y print(f回归系数截距, 温度, 是否周末: {w.flatten()}) print(f模型公式: 使用量 {w[0][0]:.1f} {w[1][0]:.1f} * 温度 {w[2][0]:.1f} * 是否周末) except np.linalg.LinAlgError: print(矩阵不可逆无法求解。) # 第6步输出分析结论模拟论文中的结论部分 print(\n 初步分析结论 ) print(f1. 单车日均使用量为 {df[单车使用量].mean():.0f} 次波动范围较大。) print(f2. 温度与使用量呈正相关相关系数 {corr_matrix.loc[温度, 单车使用量]:.2f}。) print(f3. 周末的平均使用量比工作日高 {weekend_avg[1] - weekend_avg[0]:.0f} 次。) print(4. 可视化图表已清晰展示了各变量之间的关系可用于支撑论文中的观点。)这个完整的流程展示了从数据模拟、清洗、探索、可视化到简单模型构建的全过程。在真实比赛中你的代码结构将与此高度相似只是数据更复杂模型更精细。7. 常见问题与排查思路避坑指南在紧张的比赛环境中时间就是生命。以下问题清单能帮你快速定位和解决90%的编码麻烦。问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named numpy未安装库或在错误的环境中运行。在终端输入python -c import numpy; print(numpy.__version__)1. 确认使用的是Anaconda环境。2. 在Anaconda Prompt中运行conda install numpy pandas matplotlib或pip install numpy pandas matplotlib。Jupyter Notebook中代码单元格执行后无输出1. 单元格最后一行没有打印语句。2. 代码有运行时错误但被忽略。1. 检查单元格最后一行是否是表达式或变量。2. 在代码开头添加import sys; sys.stderr.write(开始执行\n)看是否有错误输出。1. 对要查看的变量使用print()。2. 使用ShiftEnter执行单元格并查看下方的错误信息。Pandas读取CSV文件报编码错误文件编码不是UTF-8常见于中文Windows导出的文件。查看错误信息通常提示utf-8 codec cant decode...在pd.read_csv()中添加参数encodinggbk或encodinggb2312。Matplotlib图表中文显示为方框默认字体不包含中文字符。绘图前检查字体设置。在代码开头添加plt.rcParams[font.sans-serif] [SimHei]# 黑体plt.rcParams[axes.unicode_minus] False# 解决负号显示问题NumPy数组形状不匹配无法广播进行数组运算时两个数组的形状不满足广播规则。打印出参与运算的数组的.shape属性。使用np.reshape()调整数组形状或使用np.newaxis增加维度。例如a[:, np.newaxis]将行向量变为列向量。KeyError当使用df[列名]DataFrame中不存在该列名或列名有空格、大小写不一致。打印df.columns查看所有确切的列名。1. 检查拼写。2. 使用df.columns df.columns.str.strip()去除列名首尾空格。分组聚合groupby后数据混乱分组键有缺失值或聚合函数应用错误。分组前检查分组键是否有NaNdf[分组列].isnull().sum()1. 用df.dropna(subset[分组列])删除缺失行。2. 明确指定聚合函数如.agg({数值列: mean})。图表保存为图片后分辨率太低默认的DPI每英寸点数设置较低。保存时未指定dpi参数。使用plt.savefig(figure.png, dpi300, bbox_inchestight)。bbox_inchestight可以去除图片周围的白边。运行速度极慢尤其是循环操作使用了Python原生for循环处理NumPy数组或Pandas DataFrame。审查代码找到对数组或DataFrame进行逐元素操作的for循环。矢量化将循环改为NumPy的数组运算或Pandas的apply、vectorize函数。这是从Python新手到数模选手的关键一步。8. 最佳实践与竞赛编程建议掌握了基本操作后遵循以下建议能让你的建模编程过程更专业、更高效。代码组织与注释模块化将数据加载、预处理、模型定义、可视化等功能写成独立的函数或放在不同的代码单元格中。有意义的命名变量名用daily_temperature而非dt函数名用calculate_correlation()而非calc_corr()。添加注释在关键步骤、复杂公式或自定义函数上方用#添加注释说明“做什么”和“为什么这么做”。数据预处理是重中之重先探索后清洗拿到数据先用df.head()、df.info()、df.describe()和简单的图表了解全貌再决定清洗策略。处理缺失值根据情况选择删除 (dropna)、填充固定值/均值/中位数 (fillna) 或使用插值法。处理异常值使用箱线图或3σ原则识别异常值并决定是修正、删除还是保留。保存中间结果将清洗后的数据用df.to_csv(cleaned_data.csv, indexFalse)保存避免重复处理。可视化服务于论证一图一观点每张图表都应清晰地传达一个信息支撑论文中的一个论点。图表要素完整确保每张图都有标题、坐标轴标签、单位、图例必要时。风格统一论文中所有图表应保持一致的配色、字体和样式。优先选择趋势用折线图分布用直方图/箱线图关系用散点图对比用柱状图占比用饼图/环形图。模型实现与验证善用Scikit-learn对于机器学习模型回归、分类、聚类不要自己从头实现直接使用scikit-learn库。安装conda install scikit-learn。划分训练集与测试集永远不要用全部数据来评估模型效果使用train_test_split。结果可复现在代码开头设置随机种子 (np.random.seed(42),random_state42)确保每次运行结果一致。效率与协作使用Jupyter Notebook的魔法命令%%time可以测量单元格运行时间%who查看当前变量。版本控制即使是一个人也建议用Git管理代码至少备份关键版本。将最终图表和关键结果导出除了在Notebook中显示将高质量的图表保存为.png或.pdf嵌入论文。将关键数据结果导出为.csv或.xlsx备用。数学建模竞赛中编程能力是将想法落地的桥梁。通过聚焦于NumPy、Pandas、Matplotlib这三大核心工具并采用“任务驱动、问题导向”的学习方法你完全可以在极短时间内获得解决大部分建模问题的实战能力。记住你的目标不是成为Python语言学家而是成为一个能快速将数学、数据和图表连接起来的“解题者”。现在打开你的Jupyter Notebook把上面的代码逐行运行一遍开始你的数模Python速成之旅吧。建议收藏本文在备赛和竞赛期间随时查阅。