Python内置数学模块全整理,易查易阅

文章目录

  • math
  • cmath
  • statistics
  • random
  • fractions
  • decimal

math

提供了一些基础的计算功能,下列表达式默认from math import *,输入输出均为一个数字。

常见函数
三角函数 cos, sin, tan, acos, asin, atan
atan2(x,y)= arctan ⁡ y x \arctan\frac{y}{x} arctanxy
双曲函数 cosh, sinh, tanh, acosh, asinh, atanh
幂函数 exp, sqrt, expm1(x)= e x − 1 e^x-1 ex1, pow(x,y)= x y x^y xy
对数函数 log, log10, log2, log1p(x)= ln ⁡ ( 1 + x ) \ln(1+x) ln(1+x)
log(x)= ln ⁡ x \ln x lnx, log(x,y)= log ⁡ y x \log_yx logyx
取整 向上ceil, 向下floor,实值向下取整trunc
isqrt(x)相当于floor(sqrt(x))
角度转换 转角度degrees,转弧度radians
拆分 a,b = modf(x)即x=a.b,a,b=frexp(x) x = a ⋅ 2 b x=a\cdot2^b x=a2b
其他函数 阶乘factorial,绝对值fabs,最小有效比特位的值ulp
特殊函数
erf(x) 误差函数, 2 π ∫ 0 x e − η 2 d η \frac{2}{\sqrt\pi}\int^x_0e^{-\eta^2}\text d\eta π 20xeη2dη
erfc(x) 补误差函数,即1.0-erf(x)
gamma(x) Γ \Gamma Γ函数, ∫ 0 + ∞ t x − 1 t − t d t ( x > 0 ) \int^{+\infty}_0t^{x-1}t^{-t}\text dt(x>0) 0+tx1ttdt(x>0)
lgamma(x) Γ \Gamma Γ函数,即log(abs(gamma(x)))

误差函数和 Γ \Gamma Γ函数的图像如下

Python内置数学模块全整理,易查易阅_第1张图片 Python内置数学模块全整理,易查易阅_第2张图片
判断函数 isfinite(x) isinf(x) isnan(x)
True值条件 x为有限值 x为正负无穷 x为nan
常量 π \pi π e e e τ = 2 π \tau=2\pi τ=2π inf ⁡ \inf inf nan
3.14… 2.71… 6.28… 正无穷 非数字
代码 pi e tau inf nan
输入 输入为任意多个数值的函数
整数 最大公约数gcd,最小公倍数lcm
数值 精确求和fsum, 欧几里得范数hypot(可理解为均方根)
连乘prod,可选参数start表示初始值

其他函数

  • comb(n,k)= C n k = n ! k ! ( n − k ) ! C^k_n=\frac{n!}{k!(n-k)!} Cnk=k!(nk)!n!,即二项系数
  • perm(n,k)= n ! ( n − k ) ! \frac{n!}{(n-k)!} (nk)!n!
  • copysign(a,b)= ∣ a ∣ ⋅ b ∣ b ∣ |a|\cdot\frac{b}{|b|} abb
  • dist(p,q)= ∑ i ( p i − q i ) 2 \sum_i(p_i-q_i)^2 i(piqi)2
  • ldexp(x, i)= x ⋅ 2 i x\cdot 2^i x2i
  • 求余数:fmod(x,y)remainder(x, y)
  • nextafter(x, y),返回x趋向于y的最接近的浮点数值。

isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)

  • 若 a 和 b 的值比较接近则返回True,否则False
  • rel_tol 是相对容差,表示a, b之间允许的最大差值。例如,要设置5%的容差,rel_tol=0.05。rel_tol 必须大于0。
  • abs_tol 是最小绝对容差,其值不小于0。
  • 等价于abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

cmath

complex math,复数运算包,和math有很多同名函数,无非是math没法计算复数而已。在python中,创建复数的方法是

x = 1+1j
常见函数
三角和幂函数 cos, sin, tan, acos, asin, atan,exp, sqrt
双曲和反双曲 cosh, sinh, tanh, acosh, asinh, atanh
对数函数 log10, log(z)= ln ⁡ z \ln z lnz, log(x,y)= log ⁡ y x \log_yx logyx
坐标转化 转为极坐标polar,转为直角坐标rect
虚数函数 相位phase,模数(绝对值)abs
判断函数 isnanisinf,判断有限值isfinite
常量 π \pi π e e e τ = 2 π \tau=2\pi τ=2π inf ⁡ \inf inf i inf ⁡ \text i\inf iinf nan nanj
3.14… 2.71… 6.28… 正无穷 虚正无穷 非数字 虚非数字
代码 pi e tau inf infj nan nanj

在cmath中,也提供了类似math中的isclose

cmath.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)

  • 若 a 和 b 的值比较接近则返回True,否则False
  • rel_tol 是相对容差,为a, b之间允许的最大差值。例如,要设置5%的容差,rel_tol=0.05。rel_tol 必须大于0。
  • abs_tol 是最小绝对容差,其值不小于0。
  • 等价于abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

statistics

Python自带的统计学工具,功能很弱,但初学者认识一下也是好的。

下面的函数输入均为list。

中心特征
平均数 算术平均数mean,浮点算数平均数fmean
几何平均数geometric_mean,调和平均数harmonic_mean
中位数 median,分组中位数median_grouped
低中位数median_low,高中位数median_high
众数 mode,众数列表multimode
标准差 总体pstdev,样本variance
方差 总体pstdev,样本stdev

此外,quantiles()将数据以相等的概率分为多个间隔;
covariance()计算样本协方差;correlation()计算皮尔逊相关系数;linear_regression()计算简单线性回归的斜率和截距。

random

基本原理

用于生成伪随机数,之所以有个字,是因为计算机没法生成真正的随机,而只是把一个初始值变得面目全非,从而很像随机数

这个初始值,是通过seed实现的,如果不设置,则默认为当前的系统时间。

ramdom中,使用最多的应该就是random.random()了,其功能为返回一个 [ 0 , 1 ) [0,1) [0,1)区间的实数。接下来可以通过random.random()来验证以下random.seed()的功能。

>>> def rand(n):
...   random.seed(n)
...   print(random.random())
...   print(random.random())
...
>>> rand(3)
0.23796462709189137
0.5442292252959519
>>> rand(3)
0.23796462709189137
0.5442292252959519

使用seed的一个好处是方便算法复现,比如用某个随机数做算法,然后换了个随机数之后发现算法不对了,就会非常尴尬,这个时候seed就派上了用场。

相比之下,getstatesetstate更加强大,可以获取或设置当前的状态。

>>> a = random.getstate()
>>> random.random()
0.36995516654807925
>>> random.random()
0.6039200385961945
>>> random.setstate(a)
>>> random.random()
0.36995516654807925
>>> random.random()
0.6039200385961945

整数和字节

接下来的所有代码默认from random import *

randbytes(n) 生成n个字节
randrange(b) 生成一个[0,b]之间的整数
randrange(a,b,step=1) range(a,b,step)中随机选一个数
randint(a,b) 相当于randrange(a, b+1)
getrandbits(k) 相当于randint(0,2**k)

分布函数

random中的分布函数均为浮点型。

分布函数 f ( x ) f(x) f(x)
uniform(a,b) [a,b]间均匀分布 1 ∣ b − a ∣ , x ∈ [ a , b ] \frac{1}{|b-a|}, x\in[a,b] ba1,x[a,b]
triangular(a,b,mid) 三角分布
betavariate(a,b) β \beta β分布 Γ ( a + b ) Γ ( a ) Γ ( b ) x a − 1 ( 1 − x ) b − 1 \frac{\Gamma(a+b)}{\Gamma(a)\Gamma(b)}x^{a-1}(1-x)^{b-1} Γ(a)Γ(b)Γ(a+b)xa1(1x)b1
expovariate(a) 指数分布 a ⋅ e − a x x > 0 a\cdot e^{-ax}\quad x>0 aeaxx>0
gammavariate(a,b) γ \gamma γ分布 x a − 1 exp ⁡ ( − x b ) Γ ( a ) ∗ b a \frac{x^{a-1}\exp(\frac{-x}{b})}{\Gamma(a)*b^a} Γ(a)baxa1exp(bx)
gauss(b,c) 正态分布 1 2 π c exp ⁡ ( x − b ) 2 2 c 2 \frac{1}{\sqrt{2\pi}c}\exp\frac{(x-b)^2}{2c^2} 2π c1exp2c2(xb)2
normalvariate(b,c) 正态分布,慢于gauss 1 2 π c exp ⁡ ( x − b ) 2 2 c 2 \frac{1}{\sqrt{2\pi}c}\exp\frac{(x-b)^2}{2c^2} 2π c1exp2c2(xb)2
lognormvariate(b,c) 对数正态分布 1 c x 2 π exp ⁡ ( ln ⁡ x − b ) 2 2 c 2 \frac{1}{cx\sqrt{2\pi}}\exp\frac{(\ln x-b)^2}{2c^2} cx2π 1exp2c2(lnxb)2
vonmisesvariate(a,b) 冯·米塞斯分布 exp ⁡ [ b cos ⁡ ( x − a ) 2 π J 0 ( b ) ] \exp[\frac{b\cos(x-a)}{2\pi J_0(b)}] exp[2πJ0(b)bcos(xa)]
paretovariate(a) 帕累托分布 x − a x^{-a} xa
weibullvariate(a,b) 韦伯分布 b a ( x a ) b − 1 exp ⁡ [ − ( x a ) b ] \frac{b}{a}(\frac{x}{a})^{b-1}\exp[-(\frac{x}{a})^b] ab(ax)b1exp[(ax)b]

Γ ( x ) = ∫ 0 + ∞ t z − 1 e − t d t ( x > 0 ) \Gamma(x)=\int^{+\infty}_0t^{z-1}e^{-t}\text dt\quad(x>0) Γ(x)=0+tz1etdt(x>0)

J 0 ( x ) = ∑ m = 0 ∞ ( − 1 ) m m ! Γ ( m + 1 ) ( x 2 ) 2 m J_0(x)=\sum_{m=0}^\infty\frac{(-1)^m}{m!\Gamma(m+1)}(\frac{x}{2})^{2m} J0(x)=m=0m!Γ(m+1)(1)m(2x)2m

通过matplotlib可绘制一下分布的形状,以正态分布为例:

import matplotlib.pyplot as plt
xs = [gauss(0,1) for _ in range(10000)]
plt.hist(xs,1000)
plt.show()

Python内置数学模块全整理,易查易阅_第3张图片

可以说十分正态了。

用于序列的随机函数

  • choice(lst):从lst中随机选择一个数
  • shuffle(lst):把lst打乱
  • sample(lst, k, counts=None):从lst中选出k个数,counts代表lst中对应元素的个数,为整数。

choices(lst,weights=None, cum_weights=None, k=1):从lst中选择一个子列表

  • k为元素个数
  • weights为相对权重数组,长度与lst相同,每个元素都大于0,代表对应元素出现的概率权重,
  • cum_weights为累加权重数组,长度与lst相同

fractions

分数模块中主要实现了分数类Fraction,其构造函数被重载成数个,分别可以通过浮点数、两个整数或者字符串等方法,并且对运算符进行了重载。

from fractions import Fraction as Frac
>>> a = Frac("3/5")
>>> a
Fraction(3, 5)
>>> print(a.as_integer_ratio())     #将分数输出为元组
(3, 5)
>>> b = Frac(5,3)   #Fraction(5, 3)
>>> c = Frac(2.5)   #Fraction(5, 2)
>>> print(a+c)
31/10
>>> print(b/c)
2/3

类成员为

real imag numerator denominator
实部 虚部 分子 分母

此外还有一个函数a.limit_denominator(dMax),用于返回一个分母不大于dMax的最接近于a的分数。

>>> a = Frac(6.4)
>>> a           #由于舍入误差,所以得到的值并不正确
Fraction(3602879701896397, 562949953421312)
>>> a.limit_denominator(10000)
Fraction(32, 5)

decimal

在python中比较常见的问题是

>>> 0.333333333333333333333*3
1.0
>>> 0.999999999999999999999999
1.0

如果这可以算作程序的“自作聪明”的话,那么下面这个就是完全没有必要的误差了。

>>> 0.1*3-0.3
5.551115123125783e-17

decimal就为了解决这个问题,下面的代码默认from decimal imoprt *

通过Decimal来新建一个Decimal格式的数字,然后就可以像float一样使用Python中的函数了。

>>> x = Decimal(1)
>>> x
Decimal('1')
>>> x/3
Decimal('0.3333333333333333333333333333')
>>> x/3*3
Decimal('0.9999999999999999999999999999')

Decimal对象

Decimal中内置了很多函数,可以通过如下形式调用

>>> D = decimal.Decimal
>>> x = D(15)
>>> x.sqrt()
Decimal('3.872983346207416885179265400')

此外,可以输入一些字符串来得到特殊值,例如无穷大

>>> x = D('Infinity')
>>> x
Decimal('Infinity')
成员变量 imag real
虚部 实部
函数
返回自身 conjugatecanonicalnormalize返回最简形式,number_class返回类形式
用于判断 is_finite, is_infinite, is_zero, is_signed(判断正数),
is_nan, is_qnan, is_snan
is_normal, is_subnormal, is_canonical,
数学函数 exp, ln, log10, logb, sqrtcopy_abscopy_negate返回负值
舍入函数 to_integral_exactto_integral_value, to_integral
转字符串 to_eng_string转字符串,as_tuple 返回每一位数字的元组
返回分数 as_integer_ratio= a b \frac{a}{b} ba
移位函数 adjusted 返回科学计数法的指数
相邻数字 next_minusnext_plus
双元运算,默认格式为a.xxx(b)
常规运算 remainder_near求余,quantize 乘方,a.scaleb(b)= a × 1 0 b a\times10^b a×10b
逻辑运算 logical_and, logical_invert, logical_or, logical_xor
比较运算 compare 相等为0,a>b为1,a< b为-1
compare_signalcompare_totalcompare_total_mag
a.copy_sign(b)= ∣ b ∣ b a \frac{|b|}{b}a bba
same_quantum如有相同指数则返回1
相邻值 next_toward返回趋向b的最接近于a的数字
最值 max, min, max_mag, min_mag, 例如a.max(b)等价于max(a,b)

常量和成员变量

舍入模式 舍入方向
ROUND_CEILING 正无穷
ROUND_FLOOR 负无穷
ROUND_DOWN 0
ROUND_UP 0的反方向
ROUND_HALF_DOWN 最接近的数,同样接近则舍入方向为零。
ROUND_HALF_EVEN 最接近的数,同样接近时趋向偶数。
ROUND_HALF_UP 最接近的数,同样接近则舍入到零的反方向
ROUND_05UP 末位趋0或5
常量 MAX_PREC MAX_EMAX MIN_EMIN MIN_ETINY
32位 425000000 MAX_PREC -MAX_PREC -849999999
64位 1e18-1 MAX_PREC -MAX_PREC -(MAX_PREC-2)

上下文对象

在decimal中,通过上下文对象来管理精度、舍入规则等,可通过getcontextsetcontext来读取和更改。

>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[Inexact, FloatOperation, Rounded], traps=[InvalidOperation, DivisionByZero, Overflow])

decimal内置了三种上下文

>>> BasicContext
Context(prec=9, rounding=ROUND_HALF_UP, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[Clamped, InvalidOperation, DivisionByZero, Overflow, Underflow])
>>> ExtendedContext
Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[])
>>> DefaultContext
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])

如果希望自定义,可以通过Context的构造函数

Context(prec=None, rounding=None, Emin=None, Emax=None, capitals=None, clamp=None, flags=None, traps=None)

其中

  • prec为[1, MAX_PREC]范围内的整数,用于设置精度。
  • rounding 设置舍入方式。
  • EminEmax 给定指数所允许的外部上限。 Emin在 [MIN_EMIN, 0]范围内,Emax 在[0, MAX_EMAX]范围内。
  • capitals默认为1,此时指数符号为大写的E,为0是用小写e。
  • traps用于设置当前上下文的警告信息。
  • clamp 默认为0,如果设为 1,则指数e的表示范围在将被限制在 Emin - prec + 1 <= e <= Emax - prec + 1。 如果 clamp 为 0 则将适用较弱的条件: Decimal 实例调整后的指数最大值为 Emax。

除了getcontentext之外,还可以通过localcontext来获取当前上下文,其方法为

>>> with d.localcontext() as ctx:
...   print(ctx.prec)
...
28

报错与警告(signal)

在decimal中有14种警告信息(官方文档写的是10个,但源码中有14个):

DecimalException为基类外,另外13个警告信息为

Clamped 指数超限 InvalidOperation 无效操作
DivisionByZero 除零错误 DivisionImpossible 除法发生了舍入
Overflow 溢出 DivisionUndefined 未定义的除法
Subnormal 舍入前指数低于Emin
Underflow 向下溢出 FloatOperation 与float运算
Rounded 发生了舍入 ConversionSyntax 字符串转化不完美
Inexact 不精确舍入 InvalidContext 上下文有歧义

你可能感兴趣的:(#,Python标准库,python,math,cmath,statistics,random)