提供了一些基础的计算功能,下列表达式默认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 ex−1, 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=a⋅2b |
其他函数 | 阶乘factorial ,绝对值fabs ,最小有效比特位的值ulp |
特殊函数 | |
---|---|
erf(x) |
误差函数, 2 π ∫ 0 x e − η 2 d η \frac{2}{\sqrt\pi}\int^x_0e^{-\eta^2}\text d\eta π2∫0xe−η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+∞tx−1t−tdt(x>0) |
lgamma(x) |
Γ \Gamma Γ函数,即log(abs(gamma(x))) |
误差函数和 Γ \Gamma Γ函数的图像如下
判断函数 | 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!(n−k)!n!,即二项系数perm(n,k)
= n ! ( n − k ) ! \frac{n!}{(n-k)!} (n−k)!n!copysign(a,b)
= ∣ a ∣ ⋅ b ∣ b ∣ |a|\cdot\frac{b}{|b|} ∣a∣⋅∣b∣bdist(p,q)
= ∑ i ( p i − q i ) 2 \sum_i(p_i-q_i)^2 ∑i(pi−qi)2ldexp(x, i)
= x ⋅ 2 i x\cdot 2^i x⋅2ifmod(x,y)
,remainder(x, y)
nextafter(x, y)
,返回x趋向于y的最接近的浮点数值。isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
True
,否则False
。abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
即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 |
判断函数 | isnan ,isinf ,判断有限值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)
True
,否则False
。abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
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()
计算简单线性回归的斜率和截距。
基本原理
用于生成伪随机数,之所以有个伪
字,是因为计算机没法生成真正的随机,而只是把一个初始值变得面目全非,从而很像随机数
。
这个初始值,是通过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
就派上了用场。
相比之下,getstate
和setstate
更加强大,可以获取或设置当前的状态。
>>> 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] ∣b−a∣1,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)xa−1(1−x)b−1 |
expovariate(a) |
指数分布 | a ⋅ e − a x x > 0 a\cdot e^{-ax}\quad x>0 a⋅e−axx>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)∗baxa−1exp(b−x) |
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(x−b)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(x−b)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(lnx−b)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(x−a)] |
paretovariate(a) |
帕累托分布 | x − a x^{-a} x−a |
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)b−1exp[−(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+∞tz−1e−tdt(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=0∞m!Γ(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()
可以说十分正态了。
用于序列的随机函数
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中选择一个子列表
分数模块中主要实现了分数类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)
在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 |
---|---|---|
虚部 | 实部 |
函数 | |
---|---|
返回自身 | conjugate ,canonical ,normalize 返回最简形式,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 , sqrt ,copy_abs ,copy_negate 返回负值 |
舍入函数 | to_integral_exact ,to_integral_value , to_integral |
转字符串 | to_eng_string 转字符串,as_tuple 返回每一位数字的元组 |
返回分数 | as_integer_ratio = a b \frac{a}{b} ba |
移位函数 | adjusted 返回科学计数法的指数 |
相邻数字 | next_minus ,next_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_signal ,compare_total ,compare_total_mag |
|
a.copy_sign(b) = ∣ b ∣ b a \frac{|b|}{b}a b∣b∣a |
|
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中,通过上下文对象来管理精度、舍入规则等,可通过getcontext
和setcontext
来读取和更改。
>>> 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
设置舍入方式。Emin
和 Emax
给定指数所允许的外部上限。 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 |
上下文有歧义 |