Python与数学建模基础

发布时间:2026/9/3 7:45:37
Python与数学建模基础 第一章NumPy1.什么是NumPy全称Numerical Python意思Python 数值计算库。它主要解决1大量数字存储2数学运算3矩阵计算4随机模拟2.ndarrayNumPy里面的数据容器2.1.概念一维矩阵np.array([1,2,3])二维矩阵np.array([[1,2],[3,4]])类型为class numpy.ndarray2.2.shape代表维度例如bnp.array([ [1,2,3], [4,5,6]])print(b.shape)输出为(2,3)意味2行3列再看一维bnp.array([1,2,3,4,5])print(b.shape)输出为5代表有5个元素2.3.ndim维度告诉你是几维数组一维就是1.2.4.dtype数据类型print(a.dtype)可能输出int64代表数组的数据类型小数为float642.5.总结属性作用type()看变量是不是 ndarrayshape看数组结构几行几列ndim看数组维度dtype看元素类型3NumPy数组创建方式1. np.array()3.2.np.zeros()作用创建全是0的数组。一维np.zeros(5)二维np.zeros((2,3))注意有两个括号3.3.np.ones()作用创建全是0的数组。3.4.np.arange()作用生成等差整数序列格式为np.arange(start, stop, step)参数含义start开始stop结束不包含step步长例如:np.arange(0,10,2)生成0,2,4,6,83.5.np.linspace()作用在指定范围内生成固定数量的数据格式为np.linspace(start, stop, num)例如np.linspace(0,10,5)意思0到10之间生成5个点。结果0,2.5,5,7.5,106.总结4、NumPy数组索引和切片1.一维和数组几乎相同除了初始化部分anp.array([10,20,30,40,50])4.2.二维数组索引有数组Anp.array([[1,2,3],[4,5,6],[7,8,9]])二维数组的位置列0 1 2行0 1 2 3行1 4 5 6行2 7 8 9所以第0行A[0] 结果[1 2 3]取具体元素格式A[行,列]取整行例如第一行为 A[0,:]取整列例如第二列为 A[:,1] 在这两个中“”代表全部这里涉及连着取好几列行的问题要注意4.3.reshape作用改变数据结构形状比如一维变二维格式数组.reshape(新的形状)例如原数组anp.array([1,2,3,4,5,6]) 要变成两行三列的形式写ba.reshape(2,3)限制1.元素数量必须一致2.reshape不会改变原数组a还是原来的数据。b是新的视图4.4.转置 transpose矩阵行列交换线性代数的行列式转置方法一a.T方法二np.transpose(a)5NumPy 数学运算5.1.数组加减法例如import numpy as npanp.array([1,2,3])bnp.array([4,5,6])直接aba-b5.2.数组乘除法a*b a/b注意不是矩阵乘法而是对应元素相乘。相同位置元素相乘结果还是数组5.3.矩阵乘法运算符A B两者区别六广播机制Broadcasting1.标量广播例如anp.array([1,2,3])执行a*2结果为[2 4 6]相当于[1,2,3]×[2,2,2]2.一维向量加二维矩阵执行Ab6条件筛选布尔索引6.1.普通判断例如anp.array([10,20,30,40,50])现在我要找大于30的数据。Python普通思路循环for i in a:if i30:但是 NumPy 不需要直接a30输出[False False False True True] 得到一个布尔数组6.2.使用条件取数据a[a30]直接得到数据多条件筛选20x50写作(a20)(a50) 每个条件必须加括号6.3.修改满足条件的数据a[a30]0就可以了。7NumPy常用统计函数7.1.一维数组常见函数1. sum 求和np.sum(a)2. mean 平均值np.mean(a)3. max 最大值np.max(a)4. min 最小值np.min(a)5. std 标准差np.std(a)7.2.二维数组统计 axis7.2.1. 不指定 axis例如np.sum(X)全部加起来7.2.2. axis0按列计算先看np.sum(X,axis0)什么意思axis0沿着第0维变化。简单理解压缩行保留列。7.2.3 axis1按行计算np.sum(X,axis1)压缩列保留行。axis方向结果不写全部计算一个数axis0按列每列一个结果axis1按行每行一个结果8随机数Random8.1. 随机小数NumPy随机模块np.random生成0~1之间随机数np.random.rand()8.2. 生成多个随机数例如np.random.rand(5)生成5个[0,1)之间的小数。8.3. 生成随机整数使用np.random.randint()格式np.random.randint(low,high,size) 注意还是不包含右边8.4. 生成随机矩阵随机整数矩阵 np.random.randint(0,100,(3,3))8.5. 固定随机结果np.random.seed(0)print(np.random.rand())以后每次运行结果一样。9常用数学函数1. 平方根 sqrtnp.sqrt(a)2. 指数 expnp.exp(a) e的a次方3. 对数 lognp.log(a) ln(x)4. 三角函数np.sin(a)np.cos(a)用弧度制 π十线性代数基础操作NumPy提供np.linalg1.求矩阵行列式 determinant数学∣A∣代码np.linalg.det(A)2. 求逆矩阵 inverse数学A−1代码np.linalg.inv(A)3. 求特征值 eigenvalues数学Axλx代码np.linalg.eig(A)返回特征值特征向量4. 求解线性方程组例如Axb代码np.linalg.solve(A,b)第二章Pandas1什么是PandasPandas 是 Python 里面专门处理表格数据的工具2创建DataFramedfpd.DataFrame(data)意思把字典转换成表格。现在df就是Excel。例如import pandas as pddata {城市:[北京,上海,广州],GDP:[36102,38700,25000],人口:[2189,2487,1500]}df pd.DataFrame(data)print(df)3查看 DataFrame 数据df pd.read_excel(城市经济数据.xlsx)3.1. 查看前几行head()格式df.head()查看前n行df.head(n)3.2.查看数据规模shape格式df.shape 和numpy是一样的表示几行几列区别代码上没有3.3. 查看列名columns作用知道有哪些变量。格式df.columns输出Index([城市,GDP,人口],dtypeobject)3.4. 查看数据类型info()作用每一列是什么类型。代码df.info()输出class pandas.core.frame.DataFrame列:城市 objectGDP int64人口 int643.5. 查看统计信息describe()代码df.describe()它会自动计算平均值标准差最小值最大值四分位数4DataFrame 数据访问4.1.取一列数据写df[销量]和numpy的数组区别Pandas这一列带有列名索引0 1001 1202 1503 1704 200前面那一列叫做索引4.2.取多列数据df[[温度,销量]]注意这里有两个中括号外层表示 DataFrame取数据。里面是一个列表。4.3.按位置取行iloc代码df.iloc[0]输出温度 25湿度 60销量 1004.4.取多行代码df.iloc[0:3]遵循切片规则左闭右开4.5.条件筛选例如找销量大于150的数据。数学表达销量 150Pandasdf[销量]150得到0 False1 False2 False3 True4 True它不是数据它是判断结果。然后把它放回 dfdf[df[销量]150]5修改 DataFrame 数据5.1.增加一列数据现有data{温度:[25,28,30,32,35],销量:[100,120,150,170,200]}我们想增加利润例如利润 销量 × 10可以df[利润]df[销量]*105.2.增加固定值列df[年份]2026 这一列全是20265.3.修改已有列df[销量]df[销量]*10原有列会被覆盖5.4.删除列行axis0列axis1代码df.drop(年份,axis1)注意原来的df没有改变可以df df.drop(温度,axis1)5.5.修改某一个数据代码df.loc[0,销量]1206缺失值处理NaN6.1.概念城市人口GDP北京218936102上海248738700广州空25000深圳1300空“空”在 Pandas 里面叫NaN6.2.制造一个缺失数据import pandas as pdimport numpy as npdata{温度:[25,28,None,32,35],销量:[100,120,150,None,200]}dfpd.DataFrame(data)print(df)运行结果None会变成NaN6.3.查看哪里缺失方法df.isnull()输出false为有数据True为无数据比赛考 统计每列缺多少df.isnull().sum()结果为温度 1销量 16.4.删除缺失数据方法df.dropna()意思删除包含NaN的行。返回新表不修改原 df6.5.填充缺失数据方法df.fillna(0)NaN全部填入0也可以填平均值df[温度].fillna(df[温度].mean())返回新表不修改原 df7排序、分组、统计data{城市:[北京,上海,广州,深圳],GDP:[36102,38700,25000,32000]}7.1.排序格式按GPT排df.sort_values(GDP)默认从小到大。想要从大到小df.sort_values( GDP,ascendingFalse)结果城市GDP上海38700北京36102深圳32000广州25000找GDP最高的10个城市df.sort_values(GDP,ascendingFalse).head(10)7.2.统计df[GDP].mean()平均值像最大值总和也是这样7.3.分组有销售数据地区销量北京100上海200北京150上海300data{地区:[北京,上海,北京,上海],销量:[100,200,150,300]}dfpd.DataFrame(data)分组df.groupby(地区)意思是按照地区分类。求和df.groupby(地区)[销量].sum()7.4.多个统计一起做agg()df.groupby(地区)[销量].agg([mean,max,min])结果地区meanmaxmin北京125150100上海250300200总结性质不要括号方法要括号sum。max这些要括号shape这种不要括号第三章matplotlib1.主要功能1.1.添加标题plt.title(Temperature)1.2.添加坐标轴名字X轴plt.xlabel(Time)Y轴plt.ylabel(Temperature)1.3.图例 legend当有两个图例的时候需要告诉别人哪条线是什么。plt.plot(x,y1,labelModel A)plt.plot(x,y2,labelModel B)plt.legend()1.4.保存图片代码plt.savefig(result.png)例如plt.plot(x,y)plt.savefig(temperature.png)plt.show()在当前文件夹会生成temperature.png在你下载的VS Code的文件夹里面指定位置plt.savefig(E:/数学建模/06_结果/temperature.png)1.5.中文显示Matplotlib默认中文可能乱码。plt.rcParams[font.sans-serif][SimHei]加在x y坐标前面1.6.图像保存比赛推荐方式plt.savefig(result.png,dpi300,bbox_inchestight)plt.show()这句不要放在savefig前面show之后可能会清空dpi表示分辨率比赛建议300bbox_inches去除多余空白plt.savefig(E:/数学建模/06_结果/图片/result.png,dpi300,bbox_inchestight)可以指定位置2几个重要的图1.折线图plot一天温度时间温度8点2010点2512点3014点32代码import matplotlib.pyplot as pltx [8,10,12,14]y [20,25,30,32]plt.plot(x,y)plt.show()分析plt.plot(x,y) 意思把这些点连接起来。plt.show() 展示图片1.2.散点图 scatter例如import matplotlib.pyplot as pltheight[160,165,170,175]weight[50,55,65,70]plt.scatter(height,weight)plt.xlabel(height)plt.ylabel(weight)plt.show()1.3.柱状图 bar比较大小。例如import matplotlib.pyplot as pltcity[A,B,C]population[100,200,150]plt.bar(city,population)plt.show()1.4.直方图 hist看数据分布。例如import matplotlib.pyplot as pltscore[60,70,80,80,90,95,100]plt.hist(score)plt.show()1.5.箱线图Box Plot谁波动小。代码import matplotlib.pyplot as pltscore[55,60,65,70,72,75,78,80,82,85,90,95,100,150]plt.boxplot(score)plt.show()注意150可能是异常数据如果直接看平均值可能被影响。箱线图可以直接发现。你会看到中间箱子表示主要数据范围外面的点表示异常值1.6.热力图Heatmap用颜色表示数值大小。有数据身高体重年龄身高10.80.2体重0.810.3年龄0.20.31这个矩阵就是相关系数矩阵。我们希望一眼看出哪些变量关系强。使用 seaborn热力图一般不用 matplotlib使用seaborn例如import seaborn as snsimport matplotlib.pyplot as pltdata[[1,0.8,0.2],[0.8,1,0.3],[0.2,0.3,1]]sns.heatmap(data)plt.show()1.7.多图绘制 subplot论文经常一张图放多个结果。例如左边真实值右边预测值用plt.subplot()例如import matplotlib.pyplot as pltx[1,2,3,4]y1[1,4,9,16]y2[2,4,6,8]plt.subplot(1,2,1)plt.plot(x,y1)plt.title(A)plt.subplot(1,2,2)plt.plot(x,y2)plt.title(B)plt.show()解释plt.subplot(1,2,1)1 行 2 列 第1个图plt.subplot(2,2,3)------| 1 | 2 |------| 3 | 4 |------现在画第3个1.8.总结想表达的信息推荐图Python函数典型数学建模场景一个变量随时间/过程变化趋势折线图plt.plot()年份-GDP、温度变化、预测曲线、误差变化两个变量之间是否存在关系散点图plt.scatter()身高-体重、投入-产出、变量相关性初步观察多个类别之间大小比较柱状图plt.bar()不同城市人口、不同方案指标比较数据出现次数和分布情况直方图plt.hist()成绩分布、误差分布、随机数据分布一组或多组数据稳定性、异常值箱线图plt.boxplot()多算法性能比较、实验结果稳定性多个变量之间相关程度热力图sns.heatmap()相关系数矩阵、变量筛选数据占比关系饼图plt.pie()比例分析比赛较少用两个结果/多个模型同时展示多图布局plt.subplot()论文排版、模型结果对比地理位置数据地图类图geopandas等区域分布、空间分析三维关系三维图matplotlib 3D三变量关系展示热力图关键词相关性矩阵多变量特征选择题目描述第一反应预测未来趋势折线图验证模型预测效果真实值预测值折线图分析因素影响散点图分析变量相关性热力图比较不同算法效果箱线图/柱状图展示误差变化折线图分析误差分布直方图展示实验重复结果箱线图第四章SciPy1理解SciPyNumPy负责“计算数据”SciPy负责“解决数学问题”。数学问题Python工具矩阵计算NumPy积分SciPy方程求解SciPy优化SciPy统计SciPy符号推导SymPy2SciPy常用模块2.1.optimize优化、求方程以后最大值最小值参数拟合经常用。2.2.integrate积分2.3.interpolate插值插入数据2.4.stats统计例如概率分布假设检验3方程求解optimizefsolve是 SciPy 中用来寻找方程数值解的工具from scipy.optimize import fsolve例如from scipy.optimize import fsolvedef f(x):return x**2 - 4x fsolve(f, 1)print(x)返回值为2fsolve(f, 1)中的1也就是告诉fsolve“你先从 x1 附近开始找。”如果从-1开始找那么返回值是-2因此fsolve不一定帮你找到所有解多个未知数先定义def equations(vars):x, y varsreturn [x y - 10,找 x、y使这两个式子同时等于0x - y - 2]from scipy.optimize import fsolveresult fsolve(equations, [1, 1])print(result)得到[6. 4.]单变量from scipy.optimize import fsolve def f(x): return 数学表达式 result fsolve(f, 初始猜测值) print(result)多变量from scipy.optimize import fsolve def equations(vars): x, y vars return [ 方程1, 方程2 ] result fsolve(equations, [x初始值, y初始值]) print(result)4数值积分integratequad来自from scipy.integrate import quad例如第一步定义函数代码def f(x):return x**2第二步调用quadfrom scipy.integrate import quaddef f(x):return x**2result,error quad(f,0,1)print(result)Python数学f被积函数0积分下限1积分上限5优化求解 optimizeminimize优化在所有可能方案里面找一个最好方案minimize求最小值例如的最小值from scipy.optimize import minimizedef f(x):return x**2-4*x3resultminimize(f,0) 这个0也是猜测值print(result.x)注意minimize返回的不只是x里面会有很多东西messagesuccessfunxnit等等例如result.fun就是最小值x是最小值的位置要求最大值怎么办把最小值变成最大值如这里就是加负号6SciPy插值模块interpolate作用已经有一些数据但是中间缺数据怎么办使用from scipy import interpolate最常用interp1d() 一维插值例如from scipy.interpolate import interp1dx[0,2,4]y[20,30,40]finterp1d(x,y)print(f(3))输出为35.即预测x为3时y的值这里是线性插值7数值微分没公式只有数据 → 差分求导有公式SymPy例如import numpy as npxnp.array([0,1,2,3])ynp.array([0,1,4,9])dynp.gradient(y,x)print(dy)8信号处理导入from scipy import signal功能函数滤波filter寻找峰值find_peaks傅里叶分析fft卷积convolve1.滤波最简单的平滑移动平均找平均值2.SciPy寻找峰值from scipy.signal import find_peakspeaksfind_peaks(data)找最高点返回峰的位置9统计模块导入from scipy import stats问题函数平均值mean方差var标准差std相关性pearsonr概率分布norm等假设检验ttest等和numpy差不多相关性from scipy.stats import pearsonrx[160,170,180]y[50,65,80]r,ppearsonr(x,y)print(r)r:相关系数p:显著水平第五章Sympy前面 SciPy 的核心思想给计算机数字让它算结果Sympy我不知道具体数字我想让计算机处理数学公式。符号计算 Python 库1.符号变量1.1.导入 SymPyimport sympy as spx sp.Symbol(x)print(x)注意这里x不再是数值了x代表数学变量多个变量一xsp.Symbol(x)ysp.Symbol(y)二x,ysp.symbols(x y)1.2.创建数学表达式可以写import sympy as spxsp.Symbol(x)exprx**23*x5print(expr)1.3.表达式代入数字import sympy as spxsp.Symbol(x)yx**23*x5resulty.subs(x,2)print(result)subs()意思是替换数学Pythonf(x)...f(x)...def f(x):表达式 x2...x^2...exprx**2...代入 x2x2expr.subs(x,2)写表达式不要直接f(x)会报错2.符号表达式化简2.1化简simplifyexprxxxresultsp.simplify(expr)print(result)输出为3*x2.2展开 expandsp.expand((x1)**2)输出为x**22*x12.3因式分解 factor代码sp.factor(x**22*x1)2.4合并分式 together3.方程求解sp.solve()符号求解和scipy的fsolve的数值求解做好区分3.1单项式import sympy as spxsp.Symbol(x)exprx**2-4resultsp.solve(expr,x) x代表求解的变量print(result)输出为[2,-2]3.2多项式import sympy as spx,ysp.symbols(x y)eq1xy-8eq2x-y-2resultsp.solve([eq1,eq2],[x,y])print(result)输出{x:5,y:3}3.3与fsolve的区别fsolvesolve库SciPySymPy类型数值符号结果近似数字精确公式需要初值需要不需要速度快复杂方程可能慢4.符号微分使用sp.diff()完整import sympy as spxsp.Symbol(x)exprx**23*x1resultsp.diff(expr,x) 对x求导print(result)输出2*x3二阶求导sp.diff(expr,x,2)5.符号积分直接输出符号积分不是数字5.1基本积分sp.integrate()例如import sympy as spxsp.Symbol(x)exprx**2resultsp.integrate(expr,x)print(result)5.2integrate两个参数sp.integrate(x**2y,x)这里y当作常数5.3定积分sp.integrate( expr,(x,0,2))5.4多个积分变量例如sp.integrate( x*y, x,y)结语到这里我们已经把数学建模中最常用的五个 Python 库完整过了一遍NumPy 负责数组与矩阵运算Pandas 负责表格数据的读取、清洗与统计matplotlib 负责把结果画成论文里能直接用的图SciPy 负责求解方程、积分、优化与插值SymPy 则负责符号推导。它们各司其职又彼此配合基本覆盖了从数据准备、建模计算到结果展示的完整流程。学习这些库关键不在于记住每一个函数而在于建立“遇到问题知道该找谁”的感觉看到表格先想 Pandas看到矩阵先想 NumPy看到公式先想 SymPy看到数值求解先想 SciPy看到出图先想 matplotlib。建议你把这五章当作一份速查手册比赛前快速翻一遍做题时遇到卡壳就回来对照。真正上了赛场能快速想起“这个操作用哪个库、哪个函数”就已经赢过了大多数对手。祝大家在数学建模中顺利拿奖