第一章:NumPy

1.什么是NumPy

全称:

Numerical Python

意思:

Python 数值计算库。

它主要解决:

(1)大量数字存储

(2)数学运算

(3)矩阵计算

(4)随机模拟

2.ndarray:NumPy里面的数据容器

2.1.概念

一维矩阵:np.array([1,2,3])

二维矩阵:np.array([[1,2],[3,4]])

类型为:<class 'numpy.ndarray'>

2.2.shape

代表维度

例如:

b=np.array([ [1,2,3], [4,5,6]])

print(b.shape)

输出为:(2,3)意味2行3列

再看一维:

b=np.array([1,2,3,4,5])

print(b.shape)

输出为:(5,)代表有5个元素

2.3.ndim(维度)

告诉你是几维数组,一维就是1.

2.4.dtype(数据类型)

print(a.dtype)可能输出:int64,代表数组的数据类型,小数为float64

2.5.总结

属性作用
type()看变量是不是 ndarray
shape看数组结构(几行几列)
ndim看数组维度
dtype看元素类型

3:NumPy数组创建方式

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,8

3.5.np.linspace()

作用:

在指定范围内生成固定数量的数据

格式为:np.linspace(start, stop, num)

例如:np.linspace(0,10,5)

意思:0到10之间生成5个点。

结果:0,2.5,5,7.5,10

6.总结

4、NumPy数组索引和切片

1.一维和数组几乎相同,除了初始化部分:a=np.array([10,20,30,40,50])

4.2.二维数组索引

有数组:

A=np.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(新的形状)

例如原数组:a=np.array([1,2,3,4,5,6]) ,要变成:两行三列的形式

写:b=a.reshape(2,3)

限制:

1.元素数量必须一致

2.reshape不会改变原数组

a还是原来的数据。

b是新的视图

4.4.转置 transpose(矩阵行列交换)

线性代数的行列式转置

方法一:a.T

方法二:np.transpose(a)

5:NumPy 数学运算

5.1.数组加减法

例如:

import numpy as np

a=np.array([1,2,3])

b=np.array([4,5,6])

直接a+b,a-b

5.2.数组乘除法

a*b a/b

注意:不是矩阵乘法,而是对应元素相乘。(相同位置元素相乘,结果还是数组)

5.3.矩阵乘法(@运算符)

A @ B

两者区别

六:广播机制(Broadcasting)

1.标量广播

例如:a=np.array([1,2,3])

执行:a*2

结果为:[2 4 6]

相当于:[1,2,3]×[2,2,2]

2.一维向量加二维矩阵

执行:A+b

6:条件筛选(布尔索引)

6.1.普通判断

例如:a=np.array([10,20,30,40,50])

现在我要找:大于30的数据。

Python普通思路:循环:

for i in a:
if i>30:

但是 NumPy 不需要,直接:

a>30

输出:[False False False True True] 得到一个布尔数组

6.2.使用条件取数据

a[a>30],直接得到数据

多条件筛选:&

20<x<50写作:(a>20)&(a<50) 每个条件必须加括号

6.3.修改满足条件的数据

a[a<30]=0就可以了。

7:NumPy常用统计函数

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.二维数组统计 + axis

7.2.1. 不指定 axis

例如:np.sum(X),全部加起来

7.2.2. axis=0(按列计算)

先看:np.sum(X,axis=0)

什么意思?axis=0:沿着第0维变化。

简单理解:压缩行,保留列。

7.2.3 axis=1(按行计算)

np.sum(X,axis=1)

压缩列,保留行。

axis方向结果
不写全部计算一个数
axis=0按列每列一个结果
axis=1按行每行一个结果

8:随机数(Random)

8.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. 平方根 sqrt

np.sqrt(a)

2. 指数 exp

np.exp(a) e的a次方

3. 对数 log

np.log(a) ln(x)

4. 三角函数

np.sin(a)

np.cos(a)

用弧度制 π

十:线性代数基础操作

NumPy提供:np.linalg

1.求矩阵行列式 determinant

数学:∣A∣

代码:np.linalg.det(A)

2. 求逆矩阵 inverse

数学:A−1

代码:np.linalg.inv(A)

3. 求特征值 eigenvalues

数学:Ax=λx

代码:np.linalg.eig(A)

返回:

  • 特征值
  • 特征向量

4. 求解线性方程组

例如:Ax=b

代码:np.linalg.solve(A,b)

第二章:Pandas

1:什么是Pandas

Pandas 是 Python 里面专门处理表格数据的工具

2:创建DataFrame

df=pd.DataFrame(data)

意思:把字典转换成表格。

现在:df就是Excel。

例如:

import pandas as pd
data = {
"城市":["北京","上海","广州"],
"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','人口'],dtype='object')

3.4. 查看数据类型:info()

作用:每一列是什么类型。

代码:df.info()

输出:

<class 'pandas.core.frame.DataFrame'>

列:
城市 object
GDP int64
人口 int64

3.5. 查看统计信息:describe()

代码:df.describe()

它会自动计算:

  • 平均值
  • 标准差
  • 最小值
  • 最大值
  • 四分位数

4:DataFrame 数据访问

4.1.取一列数据

写:df["销量"]

和numpy的数组区别:

Pandas这一列带有:

  • 列名
  • 索引

0 100
1 120
2 150
3 170
4 200

前面那一列叫做索引

4.2.取多列数据

df[["温度","销量"]]

注意这里有两个中括号

外层:表示 DataFrame取数据。

里面:是一个列表。

4.3.按位置取行:iloc

代码:df.iloc[0]

输出:温度 25
湿度 60
销量 100

4.4.取多行

代码:df.iloc[0:3]

遵循切片规则,左闭右开

4.5.条件筛选

例如:找销量大于150的数据。

数学表达:

销量 > 150

Pandas:df["销量"]>150

得到:0 False
1 False
2 False
3 True
4 True

它不是数据,它是判断结果。

然后,把它放回 df:

df[df["销量"]>150]

5:修改 DataFrame 数据

5.1.增加一列数据

现有:

data={
"温度":[25,28,30,32,35],
"销量":[100,120,150,170,200]
}

我们想增加利润,例如:利润 = 销量 × 10

可以:df["利润"]=df["销量"]*10

5.2.增加固定值列

df["年份"]=2026 这一列全是2026

5.3.修改已有列

df["销量"]=df["销量"]*10

原有列会被覆盖

5.4.删除列

行:axis=0

列:axis=1

代码:df.drop("年份",axis=1)

注意:原来的df没有改变,可以:df = df.drop("温度",axis=1)

5.5.修改某一个数据

代码:df.loc[0,"销量"]=120

6:缺失值处理(NaN)

6.1.概念

城市人口GDP
北京218936102
上海248738700
广州25000
深圳1300

“空”,在 Pandas 里面叫:NaN

6.2.制造一个缺失数据

import pandas as pd
import numpy as np
data={
"温度":[25,28,None,32,35],
"销量":[100,120,150,None,200]
}
df=pd.DataFrame(data)

print(df)

运行结果None会变成NaN

6.3.查看哪里缺失

方法:df.isnull()

输出false为有数据,True为无数据

比赛考 :统计每列缺多少:df.isnull().sum()

结果为:温度 1
销量 1

6.4.删除缺失数据

方法:df.dropna()

意思:删除包含NaN的行。

返回新表,不修改原 df

6.5.填充缺失数据

方法:df.fillna(0)

NaN全部填入0

也可以填平均值:df["温度"].fillna(df["温度"].mean())

返回新表,不修改原 df

7:排序、分组、统计

data={
"城市":["北京","上海","广州","深圳"],
"GDP":[36102,38700,25000,32000]
}

7.1.排序

格式:按GPT排,df.sort_values("GDP")

默认:从小到大。

想要从大到小:df.sort_values( "GDP",ascending=False)

结果:

城市GDP
上海38700
北京36102
深圳32000
广州25000

找GDP最高的10个城市:df.sort_values("GDP",ascending=False).head(10)

7.2.统计

df["GDP"].mean()平均值,像最大值,总和也是这样

7.3.分组

有销售数据:

地区销量
北京100
上海200
北京150
上海300

data={
"地区":["北京","上海","北京","上海"],
"销量":[100,200,150,300]
}

df=pd.DataFrame(data)

分组:df.groupby("地区")意思是:按照地区分类。

求和:df.groupby("地区")["销量"].sum()

7.4.多个统计一起做:agg()

df.groupby("地区")["销量"].agg(
["mean","max","min"]
)

结果:

地区meanmaxmin
北京125150100
上海250300200

总结:性质不要括号,方法要括号sum。max这些要括号,shape这种不要括号

第三章:matplotlib

1.主要功能

1.1.添加标题

plt.title("Temperature")

1.2.添加坐标轴名字

X轴:plt.xlabel("Time")

Y轴:plt.ylabel("Temperature")

1.3.图例 legend

当有两个图例的时候

需要告诉别人:哪条线是什么。

plt.plot(x,y1,label="Model A")

plt.plot(x,y2,label="Model 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",
dpi=300,
bbox_inches='tight'
)

plt.show()(这句不要放在savefig前面,show之后可能会清空)

dpi表示分辨率,比赛建议300

bbox_inches,去除多余空白

plt.savefig(
"E:/数学建模/06_结果/图片/result.png",
dpi=300,
bbox_inches='tight'
)

可以指定位置

2:几个重要的图

1.折线图plot

一天温度:

时间温度
8点20
10点25
12点30
14点32

代码:

import matplotlib.pyplot as plt
x = [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 plt
height=[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 plt
city=["A","B","C"]

population=[100,200,150]
plt.bar(city,population)
plt.show()

1.4.直方图 hist

看数据分布。

例如:

import matplotlib.pyplot as plt
score=[60,70,80,80,90,95,100]
plt.hist(score)
plt.show()

1.5.箱线图(Box Plot)

谁波动小。

代码:

import matplotlib.pyplot as plt
score=[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 sns
import matplotlib.pyplot as plt
data=[
[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 plt
x=[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三变量关系展示

热力图关键词:

  • 相关性矩阵
  • 多变量
  • 特征选择
题目描述第一反应
预测未来趋势折线图
验证模型预测效果真实值+预测值折线图
分析因素影响散点图
分析变量相关性热力图
比较不同算法效果箱线图/柱状图
展示误差变化折线图
分析误差分布直方图
展示实验重复结果箱线图

第四章:SciPy

1:理解SciPy

NumPy负责“计算数据”,SciPy负责“解决数学问题”。

数学问题Python工具
矩阵计算NumPy
积分SciPy
方程求解SciPy
优化SciPy
统计SciPy
符号推导SymPy

2:SciPy常用模块

2.1.optimize

优化、求方程

以后:最大值,最小值,参数拟合经常用。

2.2.integrate

积分

2.3.interpolate

插值:插入数据

2.4.stats

统计例如:概率分布,假设检验

3:方程求解optimizefsolve

是 SciPy 中用来寻找方程数值解的工具

from scipy.optimize import fsolve

例如:

from scipy.optimize import fsolve

def f(x):
return x**2 - 4

x = fsolve(f, 1)

print(x)返回值为2

fsolve(f, 1),中的1也就是告诉 fsolve:“你先从 x=1 附近开始找。”如果从-1开始找那么返回值是-2

因此:fsolve不一定帮你找到所有解

多个未知数

先定义:

def equations(vars):

x, y = vars

return [
x + y - 10, 找 x、y,使这两个式子同时等于0
x - y - 2
]

from scipy.optimize import fsolve

result = 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:数值积分integrate:quad

来自:from scipy.integrate import quad

例如:

第一步:定义函数

代码:def f(x):
return x**2

第二步:调用quad

from scipy.integrate import quad
def f(x):
return x**2
result,error = quad(
f,
0,
1
)
print(result)

Python数学
f被积函数
0积分下限
1积分上限

5:优化求解 optimize:minimize

优化:在所有可能方案里面,找一个最好方案

minimize求最小值

例如:的最小值

from scipy.optimize import minimize
def f(x):
return x**2-4*x+3

result=minimize(f,0) 这个0也是猜测值
print(result.x)

注意:minimize返回的不只是x

里面会有很多东西:message,success,fun,x,nit等等

例如:result.fun就是最小值,x是最小值的位置

要求最大值怎么办?把最小值变成最大值,如这里就是加负号

6:SciPy插值模块:interpolate

作用:已经有一些数据,但是中间缺数据,怎么办?

使用:from scipy import interpolate

最常用:interp1d() 一维插值

例如:

from scipy.interpolate import interp1d
x=[0,2,4]

y=[20,30,40]
f=interp1d(x,y)
print(f(3))

输出为:35.即预测x为3时y的值

这里是线性插值

7:数值微分

没公式,只有数据 → 差分求导

有公式:SymPy

例如:

import numpy as np
x=np.array([0,1,2,3])

y=np.array([0,1,4,9])
dy=np.gradient(y,x)
print(dy)

8:信号处理

导入:from scipy import signal

功能函数
滤波filter
寻找峰值find_peaks
傅里叶分析fft
卷积convolve

1.滤波

最简单的平滑:移动平均,找平均值

2.SciPy寻找峰值

from scipy.signal import find_peaks

peaks=find_peaks(data)

找最高点:返回峰的位置

9:统计模块

导入:from scipy import stats

问题函数
平均值mean
方差var
标准差std
相关性pearsonr
概率分布norm等
假设检验ttest等

和numpy差不多

相关性:

from scipy.stats import pearsonr
x=[160,170,180]

y=[50,65,80]
r,p=pearsonr(x,y)
print(r)

r:相关系数,p:显著水平

第五章:Sympy

前面 SciPy 的核心思想:给计算机数字,让它算结果

Sympy:我不知道具体数字,我想让计算机处理数学公式。符号计算 Python 库

1.符号变量

1.1.导入 SymPy

import sympy as sp
x = sp.Symbol('x')
print(x)

注意:这里x不再是数值了,x代表数学变量

多个变量:

一:x=sp.Symbol('x')
y=sp.Symbol('y')

二:x,y=sp.symbols('x y')

1.2.创建数学表达式

可以写:

import sympy as sp
x=sp.Symbol('x')
expr=x**2+3*x+5
print(expr)

1.3.表达式代入数字

import sympy as sp
x=sp.Symbol('x')
y=x**2+3*x+5
result=y.subs(x,2)
print(result)

subs():意思是替换

数学Python
f(x)=...f(x)=...def f(x):
表达式 x2+...x^2+...expr=x**2+...
代入 x=2x=2expr.subs(x,2)

写表达式,不要直接f(x)会报错

2.符号表达式化简

2.1化简simplify

expr=x+x+x

result=sp.simplify(expr)

print(result)

输出为3*x

2.2展开 expand

sp.expand((x+1)**2)

输出为:x**2+2*x+1

2.3因式分解 factor

代码:sp.factor(x**2+2*x+1)

2.4合并分式 together

3.方程求解

sp.solve()符号求解,和scipy的fsolve的数值求解做好区分

3.1单项式

import sympy as sp
x=sp.Symbol('x')
expr=x**2-4
result=sp.solve(expr,x) x代表求解的变量
print(result)

输出为[2,-2]

3.2多项式

import sympy as sp
x,y=sp.symbols('x y')
eq1=x+y-8

eq2=x-y-2
result=sp.solve(
[eq1,eq2],
[x,y]
)
print(result)

输出:{x:5,y:3}

3.3与fsolve的区别

fsolvesolve
SciPySymPy
类型数值符号
结果近似数字精确公式
需要初值需要不需要
速度复杂方程可能慢

4.符号微分

使用:sp.diff()

完整:

import sympy as sp
x=sp.Symbol('x')
expr=x**2+3*x+1
result=sp.diff(expr,x) 对x求导
print(result)

输出:2*x+3

二阶求导:sp.diff(expr,x,2)

5.符号积分

直接输出符号积分,不是数字

5.1基本积分

sp.integrate()

例如:

import sympy as sp
x=sp.Symbol('x')
expr=x**2
result=sp.integrate(expr,x)
print(result)

5.2integrate两个参数

sp.integrate(x**2+y,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。建议你把这五章当作一份速查手册,比赛前快速翻一遍,做题时遇到卡壳就回来对照。真正上了赛场,能快速想起“这个操作用哪个库、哪个函数”,就已经赢过了大多数对手。祝大家在数学建模中顺利拿奖!

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐