数模学习目录

  • SciPy 学习
    • SciPy基本操作
      • 1-求解非线性方程(组)
        • 解题代码如下:
        • 运行x1、x2结果如下:
  • 解题代码如下:
        • 运行s2效果如下:
      • 2-积分
      • 3-最小二乘解
      • 4-最大模特征值及对应的特征向量
        • 运行结果如下:
  • Numpy学习(续)
    • 1 Numpy 数学函数
      • 1-三角函数
      • 2-舍入函数
        • 2-1 numpy.around()
        • 2-2 numpy.floor()
        • 2-3 numpy.ceil()
    • 2 Numpy算术函数
        • 相关代码如下:
  • Pandas学习(续)
    • # pandas的SettingWithCopyWarning
    • Pandas 数据排序
      • Series的排序:
        • 运行结果分别如下:
    • DataFrame的排序
        • 运行部分结果如下:
    • Pandas字符串处理
      • 遇到的问题:
    • 总结:
      • 每日一言:

SciPy 是一个开源的 Python 算法库和数学工具包, Scipy 是基于 Numpy 的科学计算库,用于数学、科学、工程学等领域。
SciPy库依赖于NumPy,它提供了便捷且快速的N维数组操作。
SciPy库的构建与NumPy数组一起工作,并提供了许多用户友好和高效的数字实践,
并在天文学、生物学、气象学和气候科学,以及材料科学等多个学科得到了广泛应用。
NumPy和SciPy易于使用,强大到足以依靠世界上一些顶尖的科学家和工程师。

SciPy 学习

# -*- coding = utf-8 -*-# @Time : 2022/6/30 8:20# @Author : lxw_pro# @File : SciPy.py# @Software : PyCharm'''SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。'''# 安装scipy库:# SciPy终端安装命令:pip install SciPy# https://www.runoob.com/w3cnote/python-pip-install-usage.htmlPython pip 安装与使用# 查看scipy版本:import scipyprint(scipy.__version__)# SciPy模块功能表'''模块功能scipy.cluster 聚类分析等scipy.constants 物理和数学函数scipy.fftpack 傅里叶变换scipy.integrate 积分scipy.interpolate 插值scipy.io数据输入和输出scipy.linalg线性代数scipy.ndimage n维图像scipy.odr 正交距离回归scipy.optimize优化scipy.signal信号处理scipy.sparse稀疏矩阵scipy.spatial 空间数据结构和算法scipy.special 特殊函数scipy.stats 统计'''# 使用 dir() 函数来查看 constants 模块包含的常量:from scipy import constantsprint(dir(constants))'''单位类型常量模块包含以下几种单位:公制单位二进制,以字节为单位质量单位角度换算时间单位长度单位压强单位体积单位速度单位温度单位能量单位功率单位力学单位'''print()# SciPy 常量模块:# constants 是 scipy 的常量模块from scipy import constants# 查看一英亩等于多少平方米:print(constants.acre) # 输出 4046.8564223999992# SciPy 常量模块 constants 提供了许多内置的数学常数# 圆周率:pi# 黄金比例: goldenfrom scipy import constantsprint(constants.pi) # 输出 3.141592653589793 【圆周率】print(constants.golden) # 输出 1.618033988749895 【黄金比例】


SciPy基本操作

1-求解非线性方程(组)

1-1

解题代码如下:

# scipy.optimize模块的fsolve和root可求非线性方程(组)的解# 格式:from scipy.optimize import fsolvefrom scipy.optimize import root# fsolve或root求解非线性方程组时,先把非线性方程组写成 F(x)=0 这样的形式【x:向量;F(x):向量函数】fx = lambda x: x**980-5.01*x**979-3.388*x**977\+7.398*x**978-x**3+5.01*x**2-7.398*x+3.388x1 = fsolve(fx, 1.5, maxfev=420) # 函数调用420次【调用小了,会报警告】x2 = root(fx, 1.5)print(x1) # 相当于答案print()print(x2) # 相当于解题过程

运行x1、x2结果如下:

1-2

解题代码如下:

from scipy.optimize import fsolve, rootfs2 = lambda s: [s[0]**2+s[1]**2-1, s[0]-s[1]]s1 = fsolve(fs2, [1, 1])print()s2 = root(fs2, [1, 1])print(s1)# 输出 [0.70710678 0.70710678]print()print(s2)

运行s2效果如下:


2-积分

scipy.integrate模块提供了多种积分模式。

积分主要分为以下两类:

  1. 对给定函数的数值积分
  2. 对给定离散点的数值积分,函数有trapz

题目

'''函数说明quad(func, a, b, args)计算一重数值积分dblquad(func, a, b, gfun, hfun, args) 计算二重数值积分tplquad(func, a, b, gfun, hfun, qfun, rfun) 计算三重数值积分nquad(func, ranges, args) 计算多变量积分'''from scipy.integrate import quaddef func(x, a, b):return a*x**2+b*xz1 = quad(func, 0, 1, args=(2, 1))z2 = quad(func, 0, 1, args=(2, 10))print(z1) # 输出 (1.1666666666666665, 1.2952601953960159e-14)print(z2) # 输出 (5.666666666666667, 6.291263806209221e-14)# 注:输出的后一个值为积分值的绝对误差

3-最小二乘解

# 最小二乘解# scipy.optimize 模块求非线性方程组最小二乘解格式:'''from scipy.optimize import least_squaresleast_squares(fun, x0)注:用到loadtxt需自行准备好文件【准备文件】'''from scipy.optimize import least_squaresimport numpy as nps = np.loadtxt('data.txt')x0 = s[0]y0 = s[1]d = s[2]fs = lambda x: np.sqrt((x0-s[0])**2+(y0-s[1])**2-d)xc = least_squares(fs, np.random.rand(2))print(xc)print()print(xc.s)

4-最大模特征值及对应的特征向量

题目

# 4-最大模特征值及对应的特征向量# 题目描述:求下列矩阵的最大模特征值及对应的特征向量:from scipy.sparse.linalg import eigsimport numpy as npm = np.array([[1, 2, 3],[2, 1, 3],[3, 3, 6]], dtype=float)a, b = np.linalg.eig(m)c, d = eigs(m, 1)print('最大模特征值为:', c)# 输出 最大模特征值为: [9.+0.j]print('对应的特征向量:\n', d)

运行结果如下:



Numpy学习(续)

# -*- coding = utf-8 -*-# @Time : 2022/6/30 14:20# @Author : lxw_pro# @File : Numpy 广播-7.py# @Software : PyCharm# NumPy 广播(Broadcast)# 广播是 numpy 对不同形状的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。# 如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。# 这要求维数相同,且各维度的长度相同。'''对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:数组拥有相同形状。当前维度的值相等。当前维度的值有一个是 1。若条件不满足,抛出 "ValueError: frames are not aligned" 异常'''import numpy as npa = np.array([3, 6, 9])b = np.array([2, 4, 6])c = a * bprint(c)# 输出 [ 6 24 54]# 若形状不同时,numpy 将自动触发广播机制import numpy as npx = np.array([[4, 2, 5],[5, 2, 0],[2, 6, 1],[1, 4, 5]])y = np.array([3, 1, 2])print(x+y)yy = np.tile(y, (4, 1)) # 重复b的各个维度print(x+yy)

1 Numpy 数学函数

1-三角函数

# NumPy 数学函数# NumPy 包含大量的各种数学运算的函数,包括三角函数,算术运算的函数,复数处理函数等。# 1-三角函数# NumPy 提供了标准的三角函数:sin()、cos()、tan()。import numpy as nplxw = np.array([0, 30, 45, 60, 90])# sin()zx = np.sin(lxw*np.pi/180)print(zx)# 计算角度的反正弦【单位:弧度】fzx = np.arcsin(zx)print(fzx)# 检查结果【通过转化为角度制】jg = np.degrees(fzx)print(jg) # 输出 [ 0. 30. 45. 60. 90.]# cos()yx = np.cos(lxw*np.pi/180)print(yx)# 反余弦fyx = np.arccos(yx)print(fyx)# 检查结果:jg2 = np.degrees(fyx)print(jg2)# 输出 [ 0. 30. 45. 60. 90.]# tan()zq = np.tan(lxw*np.pi/180)print(zq)# 反正切fzq = np.arctan(zq)print(fzq)# 检查结果:jg3 = np.degrees(fzq)print(jg3)# 输出 [ 0. 30. 45. 60. 90.]

2-舍入函数

2-1 numpy.around()

# 2-舍入函数# 2-1 numpy.around()'''numpy.around() 函数返回指定数字的四舍五入值。格式:numpy.around(a,decimals)参数说明:a: 数组decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置'''import numpy as npbl = np.array([15.222, 22.6555, 13.71111])print(np.around(bl))# 输出 [15. 23. 14.]print(np.around(bl, 2)) # 输出 [15.22 22.66 13.71]print(np.around(bl, -1))# 输出 [20. 20. 10.]

2-2 numpy.floor()

# 2-2 numpy.floor()# numpy.floor() 返回小于或者等于指定表达式的最大整数,即向下取整import numpy as npxx = np.array([23.3, 13.43, 2.9])print(np.floor(xx)) # 输出 [23. 13.2.]

2-3 numpy.ceil()

# 2-3 numpy.ceil()# numpy.ceil() 返回大于或者等于指定表达式的最小整数,即向上取整import numpy as npxs = np.array([23.1, 23.5, 54.9])print(np.ceil(xs))# 输出 [24. 24. 55.]

2 Numpy算术函数

NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()

  • 倒数:reciprocal()
  • 幂: power()
  • 余数:mod() | remainder()

:数组必须具有相同的形状符合数组广播规则

相关代码如下:

import numpy as npsz = np.arange(9, dtype=np.float_).reshape(3, 3)sz2 = np.array([5, 2, 1]) # 注:如果相除,这里是被除数的话,里面不能有0# 数组相加xj = np.add(sz, sz2)print(xj)# 数组相减xj2 = np.subtract(sz, sz2)print(xj2)# 数组相乘xc = np.multiply(sz, sz2)print(xc)# 数组相除xc2 = np.divide(sz, sz2)print(xc2)print()# numpy.power()# numpy.power() 函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂import numpy as npm = np.array([1, 4, 8]) # 数组1mc = np.power(m, 3) # 数组1所有元素对应的3次方print(mc) # 输出 [164 512]m2 = np.array([1, 2, 3])# 数组2mc2 = np.power(m, m2) # 数组1作为底数,数组2作为幂print(mc2)# 输出 [116 512]print()# numpy.mod()# numpy.mod() 计算输入数组中相应元素的相除后的余数# 函数 numpy.remainder() 也产生相同的结果import numpy as npsz1 = np.array([23, 45, 67])sz2 = np.array([2, 3, 5])print(np.mod(sz1, sz2)) # 输出 [1 0 2]print(np.remainder(sz1, sz2)) # 输出 [1 0 2]

Pandas学习(续)

# pandas的SettingWithCopyWarning

# pandas的SettingWithCopyWarning报警复现、原因、解决方案# 读取数据import pandas as pddf = pd.read_csv('nba.csv')print(df.head())# 核心解决问题:pandas的dataframe的修改写操作,只允许在源dataframe上进行,一步到位# 解决方法(两种):'''1-将get+set的两步操作,改成set的一步操作2-若须处理筛选数据做后续的处理分析,使用copy复制dataframe'''# pandas不允许先筛选子dataframe,在进行修改写入

注意先准备好csv文件


Pandas 数据排序

Series的排序:

# -*- coding = utf-8 -*-# @Time : 2022/6/30 15:42# @Author : lxw_pro# @File : pandas 数据排序-9.py# @Software : PyCharm# Pandas 数据排序'''Series的排序:Series.sort_values(ascending=True, inplace=False)参数说明:· ascending: 默认为True升序排序,False为False· inplace: 是否修改原始SeriesDataFrame的排序:DataFrame.sort_values(by, ascending=True, inplace=False)参数说明:· by:字符串或者List,单列排序或者多列排序· ascending: bool或者List,升序还是降序· inplace: 是否修改原始DataFrame'''# Series的排序:import pandas as pddf = pd.read_csv('nba.csv')print(df.head())# 输出前五行print(df['Weight'].sort_values())# 升序排序print(df['Weight'].sort_values(ascending=False)) # 降序排序

运行结果分别如下:


DataFrame的排序

# DataFrame的排序# 单列排序:print(df.sort_values(by='Weight'))

运行部分结果如下:


print(df.sort_values(by="Weight", ascending=False)) # 降序排序


# 多列排序:print(df.sort_values(by=['Age', 'Weight']))


# 两个字段都是降序排序print(df.sort_values(by=['Age', 'Weight'], ascending=False))


# 分别指定升序还是降序print(df.sort_values(by=['Age', 'Weight'], ascending=[False, True]))


Pandas字符串处理

之前我就在这个字符串处理的题上出了一些问题(不过当天就解决啦)【今天在来看看】,也就是

df['lrl'].str.replace("%", "").astype("int32")
# Pandas字符串处理:'''1-使用方法:先获取Series的属性,然后再属性上调用函数2-只能在字符串列上使用,不能再数字列上使用3-DataFrame没有str属性和使用4-Series.str并不是原生Python字符串,它是封装的一套方法'''# 获取Series的属性# print(df['Salary'].str) # 报错【示范】# AttributeError: Can only use .str accessor with string values!# AttributeError:只能使用。带字符串值的str访问器!# 一定得是字符串列print(df['College'].str)# 运行结果为: # 判断是不是数字列print(df['College'].str.isnumeric())# print(df['College'].len)# 报错【示范】# AttributeError: 'Series' object has no attribute 'len'# AttributeError:“Series”对象没有属性“len”


# 使用str的startswith、contains等得到bool的Series可以做条件查询tj = df['Height'].str.startswith("6-2")print(tj)# print(df[tj].head())# ValueError:无法使用包含NA/NaN值的非布尔数组进行掩码


# 去掉Height中间的“-”print(df['Height'].str.replace("-", ""))


# 取第一位数print(df['Height'].str.replace("-", "").str.slice(0, 1))# 同上print(df['Height'].str.replace("-", "").str[0:1])

遇到的问题:

  • 自己弄的文件和上面的文件不同,做起来还是增加了点难度,不过那都不是事儿,主要能解决就好,这样错多了也可以更加熟练掌握,是吧!

总结:

今天我学习到了新的库SciPy,挺有意思的,但同时要想学好,确实也不是那么容易的,当然,我也不会止步于此的,继续向前,向前走,向前冲!人生,不就是走走停停嘛,这样才有趣,对吧!!

每日一言:

所谓有趣的灵魂,实际上就是这个人的信息密度和知识层面,都远高于你,并愿意俯下身来听你说那毫无营养的废话和你交流,提出一些你没有听过的观点,颠覆了你短浅的想象力及三观。