0%

Python-数学

一些数学操作相关的 Python 模块。如:

  • random:【标准库】生成伪随机数。
  • uuid:【标准库】生成通用唯一标识符(Universally Unique ID)
  • math:【标准库】基础数学操作,提供对底层 C 函数库的访问
  • decimal:【标准库】提供 Decimal 数据类型用于十进制浮点运算
  • statistics:标准库,计算数值数据的基本统计值,如均值、中位数、方差等,BUT,建议统一用 numpy
  • sympy:symbolic mathematics:符号型数学计算库,支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能

概述

random

random:【标准库】生成伪随机数。

1
2
3
4
5
6
7
8
9
10
11
12
import random
random.random() # 0 到 1.0 的随机浮点数,0<=n<1.0
random.uniform(a,b) # a 到 b 的随机浮点数,a<=n<=b
random.randint(a,b) # a 到 b 的随机整数,a<=n<=b
random.randrange(start,stop,step) # 按指定整数步长取随机数,[1,3,5,7,...]
random.choice("hello") # 从 sequence 中随机取一个值,'h' 'e' 'l' 'l' 'o'
list1=random.shuffle(['1','3','5'])
print(list1) # shuffle 返回 None,只是改变了列表本身,得用下面这种方式
list2=['1','3','5']
random.shuffle(list2)
print(list2)
print(random.sample(list(range(120)),4))#不改变原有序列情况下,随机取 k 个值的列表
1
random.seed(0) # 确定随机序列的初始点,使两次跑同一个程序结果一样
1
2
3
# attention
random.choice(list_a,k=2)# 长度为k的list,有放回采样
random.sample(list_a,k) # 长度为k的list,无放回采样

uuid

uuid:【标准库】生成通用唯一标识符(Universally Unique ID)

1
2
3
4
5
import uuid
# uuid4(),生成 128 比特的随机化数字,几乎是唯一的,但存在概率性重复,最好不用
user_id = uuid.uuid4()
# 基于时间戳, 由 MAC 地址、当前时间戳、随机数生成。可以保证全球范围内的唯一性,但 MAC 的使用同时带来安全性问题,局域网中可以使用 IP 来代替 MAC。
uuid.uuid1()

math

#最佳实践

math:【标准库】基础数学操作,提供对底层 C 函数库的访问

常用属性

1
2
math.pi   #圆周率 pi 的近似值
math.e #2.71828

常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
math.sqrt(4)
#以下操作均为返回一个浮点数值,而不是改变 x 的值
math.sin(x) #弧度 x 的正弦
math.cos(x) #弧度 x 的余弦
math.tan(x)
matn.asin(x) #反正弦
math.acos(x) #反余弦
math.atan(x) #反正切
math.degrees(x) #返回角度 x 的弧度值
math.log(x) # x 的自然对数,以 e 为底
math.log10(x) # x 的常用对数,以 10 为底
math.log1p:返回 x+1 的自然对数(基数为 e)的值
math.log2:返回 x 的基 2 对数
math.exp(x) #e 的 x 次方
math.ceil(x) #最小的大于等于 x 的整数 ceil(3.5) 4
math.floor(x) #最大的小于等于 x 的整数 floor(3.5) 3
math.trunc(x) #返回 x 的整数部分
math.fabs(x) # 返回 x 的绝对值
math.factorial(x) # 返回 x 的阶乘
math.gcd(x,y) # 返回 x 和 y 的最大公约数
math.modf(x) # 返回由 x 的小数部分和整数部分组成的元组
math.fsum() # 对迭代器里的每个元素进行求和操作
math.isfinite(x) # 如果 x 是正无穷大或负无穷大,则返回 True,否则返回 False
math.isinf(x) # 如果 x 是正无穷大或负无穷大,则返回 True,否则返回 False
math.isnan(x) # 如果 x 不是数字 True,否则返回 False
math.copysign(x,y) # 返回一个将 y 的正负号加到 x 前面的浮点数
# 不用
math.pow(x,y) # x**y
math.fmod(x,y) # x%y
math.hypot(x,y) # sqrt(x**2+y**2)
math.frexp() # 返回一个元组(m,e),其计算方式为:x 分别除 0.5 和 1,得到一个值的范围???

decimal

decimal:【标准库】提供 Decimal 数据类型用于十进制浮点运算

  • Decimal 可以模拟手工运算来避免当二进制浮点数无法精确表示十进制数时会导致的问题。
  • 相比于 float 的二进制浮点实现,十进制浮点计算更为精确,能更好的控制四舍五入以满足财务应用的需求,实现用户期望结果与手工完成的计算完全一致。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# decimal 与 float 差异性
from decimal import Decimal
round(0.735,2) # 0.73
round(float('0.735'),2) # 0.73
round(Decimal(0.735),2) # 0.73
round(Decimal('0.735'),2) # 0.74

# 精确表示的特性:可执行二进制浮点数不适用的模运算与相等性检测
Decimal('1.00') % Decimal('.10') # Decimal('0.00')
1.00 % 0.10 # 0.09999999999999995
sum([Decimal('0.1')]*10) == Decimal('1.0') # True
sum([0.1]*10) == 1.0 # False

# 足够的精度
decimal.getcontext().prec=100
Decimal(1)/Decimal(3)
# Decimal('0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333')

statistics

statistics:标准库,计算数值数据的基本统计值,如均值、中位数、方差等,BUT,建议统一用 numpy

1
2
3
4
5
import statistics
data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
statistics.mean(data) # 均值
statistics.median(data) # 中位数
statistics.variance(data) # 方差

sympy

sympy:symbolic mathematics:符号型数学计算库,支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能

  • 目标是成为全功能的计算机代数系统(Computer Algebra System,CAS)
  • 代码简洁、易于理解与扩展

数值类型

  • 实数
  • 有理数:两个整数表示有理数,Rational(1,2) 表示 1/2
  • 整数

符号表示

1
2
import sympy
x,y=sympy.Symbols
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sympy import
# 定义字符
a, b, r, t = symbols('a b r t')
#将所有项移至左端,右端为零
eq1 = (sqrt(3)*(2*r+t)/4 - a)**2 + ((2*r+t)/4 - b)**2 - r**2
eq2 = (r - a)**2 + b**2 - r**2
eq3 = (sqrt(3)*(2*r-t)/4 - a)**2 + ((2*r-t)/4 + b)**2 - r**2

# 求解函数,[eq1, eq2]为函数,[a, b]为未知数
c = solve([eq1, eq2], [a, b])
d = solve([eq1, eq3], [a, b])

# 输出结果,pretty 为手写形式函数,更易读
print(c, '\n'*2, pretty(d))
给博主来一杯卡布奇诺