Python 计算两个连通子图距离_Python入门 科学计算

在科学研究或工程设计中,经常依靠数学建模,将复杂问题转化为数学公式;我们对数学公式的求解过程,就是科学计算。 说白了,就是高中数学、大学数学,当年我们用手算,现在编写程序来算;当年我们关注公式推导,现在关注计算过程。 数学理论是科学计算的基础,python仅仅提供了合适的语法和函数,是“名副其实的计算工具”;如果要从事科学计算,先买本数学书吧。

关注点

一切数学函数,都可以表达成y=f(x);其中,f是算法,x是输入: ①我们通过公式推导,可以将 简化为若干基础函数,然后直接调用; ②则可能是 “1个数字/1个数组/1个矩阵/n维数组”,越往后越复杂; ③为了获得直观且感性的了解,还需要用图形呈现数据。python通过3个库来支持科学计算:① NumPy:支持n维数组计算,以及计算相关的基础功能(面向  x)② SciPy:在Numpy基础上,扩展大量数学函数(面向  f)③ Matplotlib:以图形方式呈现数据

pip install numpy scipy matplotlib

安装科学计算相关的库

1.n维数组计算

毕业多年,很多数学知识都还给了老师,先做个简单复习吧。二维数组比一维数组复杂,原理又与多维数组相同,所以我们从它开始入手;二维数组看上去像一个矩阵,因此又叫 矩阵计算,建议参考这篇文章。

http://www2.edu-edu.com.cn/lesson_crs78/self/j_0022/soft/ch0605.html

矩阵计算
精华内容提取如下:①矩阵  转置:就是行列互换②矩阵  与数字运算:将数字运算分配到每个元素上③矩阵  +矩阵:同型矩阵,在相同位置上的元素相加④矩阵  *矩阵:将第1个矩阵的每一行视为一个向量,第2个矩阵的每一列视为一个向量;两个向量的每个元素,相乘再求和,又被成为内积;第1个向量的行,第2个向量的列,就是内积在结果矩阵中的位置先简单熟悉一下Numpy的矩阵计算语法:
import numpy as np# 创建多维数组一维数组 = np.array([1, 3, 5, 7, 0, 2, 4, 6, 8])print('\n一维数组:')print(一维数组)# 维度变换矩阵 = 一维数组.reshape(3, 3)print('\n矩阵(二维数组):')print(矩阵)# 切片:多个维度的范围交集切片 = 矩阵[:2, :]print('\n切片:')print(切片)# 矩阵 转置:行列互换矩阵转置 = 切片.Tprint('\n矩阵 转置:')print(矩阵转置)# 矩阵 与数字运算:每个元素都参与matrixNum = 切片 * 2 + 1print('\n矩阵 与数字运算:')print(matrixNum)# 矩阵 +矩阵:每个相同位置上的元素相加矩阵相加 = matrixNum + 切片print('\n矩阵 +矩阵:')print(矩阵相加)# 矩阵 *矩阵:列向量*行向量矩阵相乘 = np.dot(matrixNum, 矩阵转置)print('\n矩阵 *矩阵:')print(矩阵相乘)
VSCode运行结果:

18dd54dc1d7f8e33487dc11dee9f1b41.png

当前在全国范围内推行义务教育均衡,衡量的方法是计算差异系数,低于给定值即为达标。我们用刚学到的Numpy试着算一下:

方差 = Σ(样本 - 平均值)² / 样本量

标准差 = 方差½

差异系数 = 标准差 / 平均值

差异系数公式
示例代码如下:
import numpy as np# 用随机数模拟100个学校的生均图书册数样本 = np.random.randint(30, 50, size=100)样本量 = 样本.size平均值 = np.mean(样本)print('样本:' + str(样本))print('样本量:' + str(样本量))print('平均值:' + str(平均值))# 方差 = Σ(样本 - 平均值)² / 样本量# 1)用到一个技巧:数组求和时,可以利用矩阵乘法,乘以一个全部元素为1的向量# 2)使用numpy提供的方差函数方差 = np.dot(np.power(样本 - 平均值, 2), np.ones(100, int)) / 样本量方差2 = np.var(样本)print('方差:' + str(方差))print('方差2:' + str(方差2))# 标准差 = 方差½# 1)使用numpy提供的平方根函数# 2)使用numpy提供的标准差函数标准差 = np.sqrt(方差)标准差2 = np.std(样本)print('标准差:' + str(标准差))print('标准差2:' + str(标准差2))# 差异系数 = 标准差 / 平均值差异系数 = 标准差 / 平均值差异系数2 = 标准差2 / 平均值print('差异系数:' + str(差异系数))print('差异系数2:' + str(差异系数2))

使用了两种计算方式:复杂的方式是为了演示矩阵计算的技巧,简单的方式是直接调用numpy提供的统计函数

两个例子足够了,主要演示 基于多维数组的计算

2.数学函数

SciPy提供了大量数学函数,并且按模块分类:

cluster向量计算 / Kmeans
constants物理和数学常量
fftpack傅里叶变换
integrate积分程序
interpolate插值
io数据输入和输出
linalg线性代数
ndimagen-维图像包
odr正交距离回归
optimize优化
signal信号处理
sparse稀疏矩阵
spatial空间数据结构和算法
special特殊数学函数
stats统计
涉及的数学知识面很广, 可以在用到的时候,根据分类找到模块名称,然后百度这个模块下包含哪些函数。 我的数学水平有限,咱就找个 简单 函数调用一下吧。问题:计算正弦波在区间[0, 2]中的面积。思路:对函数sin(x)进行积分运算,记作:∫₀² sin(x) dx代码:
import numpy as npfrom scipy import integrate# ∫₀² sin(x) dx# 积分函数是 integrate.quad(函数, 下限, 上限)# 正弦函数是 np.sin# 区间是 [0, 2]# 返回元组类型 (面积, 计算精度)area, precision = integrate.quad(np.sin, 0, 2)print('面积:' + str(area))print('计算精度:' + str(precision))
VSCode运行结果:

4433134d6f755114f4d7676b2dd500d5.png

3.数据图表

matplotlib给图表定义了这样一组概念:呈现画面的窗口是一张画布figure,可以将它均匀切分成几个部分;每个部分画一个子图axes,子图的画法依赖坐标系;坐标系由多个坐标轴axis组成,在轴上填好数据,图形自然呈现。

画图的语法如下:

①图形元素的包含关系: figure(画布) > axes(子图) > axis(坐标轴) > data(数据)②画图由pyplot模块支持,需要将其导入 “ from matplotlib import pyplot as plt”③创建画布的语法为 “ figure = plt.figure()”④创建子图的语法为 “ ax = fig.add_subplot(行/列/顺序)”,行和列将画布均匀切分,顺序指定了子图的位置⑤创建坐标轴的语法为 “ ax.set(xlim=[x轴min, x轴max], ylim=[y轴min, y轴max], , ylabel="y轴", xlabel="x轴")”⑥填充数据的语法为 “ ax.plot/bar/scatter(x轴数组, x轴数组)”,plot/bar/scatter 分别对应 曲线填充/柱状填充/散点填充 ⑦如果有汉字,需要指定中文字体 “plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']”⑧所有图形元素创建完之后,用 “ plt.show()” 呈现图形

标准代码模板如下:

import numpy as npimport matplotlib.pyplot as plt# 1)创建画布fig = plt.figure()# 2)创建子图ax1 = fig.add_subplot(221)ax2 = fig.add_subplot(222)ax3 = fig.add_subplot(223)ax4 = fig.add_subplot(224)# 3)创建坐标轴ax1.set(xlim=[10, 40], ylim=[0, 50], title="折线图", ylabel="y轴", xlabel="x轴")ax2.set(xlim=[0, 50], ylim=[0, 50], title="柱状图", ylabel="y轴", xlabel="x轴")ax3.set(xlim=[0, 60], ylim=[0, 50], title="饼状图")ax4.set(xlim=[-10, 60], ylim=[0, 60], title="散点图")# 4)填充数据x = np.array([10, 20, 30, 40])y = np.array([10, 20, 25, 40])# 折线图:x,y, 颜色,线宽,用来看趋势ax1.plot(x, y, color='lightblue', linewidth=3)# 柱状图:x,y, 颜色,柱宽,用来对比ax2.bar(x, y, color='red', width=2)ax2.bar(x + 2, y * 1.2, color='blue', width=2)# 饼状图:x,用来看比例ax3.pie(x)# 散点图:x,y, 颜色,大小,用来看密集程度ax4.scatter(x, y, color='red', s=1)# 中文字体plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']plt.show()

VSCode运行结果:

e7f69d6449140ef840b3542f1ff8d5d6.png

在我们用图形呈现函数规律的时候,取值范围不可能是无限的,只能从区间范围内选择有限的点,这时要用到 “np.arange(起点, 终点, 步长)” 或 “np.linspace(起点, 终点, 个数)” ;而且,我们还可以移动坐标轴的位置、设置轴上的刻度。

具体以正弦曲线为例:

import numpy as npimport matplotlib.pyplot as plt# 1)创建画布fig = plt.figure()# 2)创建子图ax1 = fig.add_subplot(111)# 3)创建坐标轴ax1.set(    xlim=[-2 * np.pi, 2 * np.pi],    ylim=[-2, 2],    title="正弦函数",    ylabel="y轴",    xlabel="x轴",    # 设置坐标轴刻度    xticks=[-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi],    yticks=[-1, 0, 1])# 让坐标轴居中ax1.spines['right'].set_color('none')ax1.spines['top'].set_color('none')ax1.xaxis.set_ticks_position('bottom')ax1.spines['bottom'].set_position(('data', 0))ax1.yaxis.set_ticks_position('left')ax1.spines['left'].set_position(('data', 0))# 4)填充数据x = np.linspace(-2 * np.pi, 2 * np.pi, 100)y = np.sin(x)# 折线图:x,y, 颜色,线宽,用来看趋势ax1.plot(x, y, color='lightblue', linewidth=1)# 中文字体plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']plt.show()

采样点取10,画出的效果是:

5a75e1597ded5da02c6de063e29e7097.png

采样点取100,画出的效果是:

ddf0f77285a91dc7c9f70ff004a3def9.png

总结:

①Python做科学计算需要用到3个库:NumPy + SciPy + Matplotlib

②Numpy提供基于多维数组的计算,SciPy提供丰富的数学函数,Matplotlib提供画图工具

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值