文章目录

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


math

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

常见函数

三角函数

cos, sin, tan, acos, asin, atan

atan2(x,y)=Python中绝对误差 python误差函数_cmath

双曲函数

cosh, sinh, tanh, acosh, asinh, atanh

幂函数

exp, sqrt, expm1(x)=Python中绝对误差 python误差函数_python_02, pow(x,y)=Python中绝对误差 python误差函数_statistics_03

对数函数

log, log10, log2, log1p(x)=Python中绝对误差 python误差函数_statistics_04

log(x)=Python中绝对误差 python误差函数_Python中绝对误差_05, log(x,y)=Python中绝对误差 python误差函数_python_06

取整

向上ceil, 向下floor,实值向下取整trunc

isqrt(x)相当于floor(sqrt(x))

角度转换

转角度degrees,转弧度radians

拆分

a,b = modf(x)即x=a.b,a,b=frexp(x)Python中绝对误差 python误差函数_statistics_07

其他函数

阶乘factorial,绝对值fabs,最小有效比特位的值ulp

特殊函数

erf(x)

误差函数,

erfc(x)

补误差函数,即1.0-erf(x)

gamma(x)

函数,Python中绝对误差 python误差函数_math_10

lgamma(x)

Python中绝对误差 python误差函数_math_10函数,即log(abs(gamma(x)))

误差函数和Python中绝对误差 python误差函数_math_10函数的图像如下

判断函数

isfinite(x)

isinf(x)

isnan(x)

True值条件

x为有限值

x为正负无穷

x为nan

常量

nan


3.14…

2.71…

6.28…

正无穷

非数字

代码

pi

e

tau

inf

nan

输入

输入为任意多个数值的函数

整数

最大公约数gcd,最小公倍数lcm

数值

精确求和fsum, 欧几里得范数hypot(可理解为均方根)

连乘prod,可选参数start表示初始值

其他函数

  • comb(n,k)=Python中绝对误差 python误差函数_math_17,即二项系数
  • perm(n,k)=Python中绝对误差 python误差函数_math_18
  • copysign(a,b)=Python中绝对误差 python误差函数_python_19
  • dist(p,q)=Python中绝对误差 python误差函数_math_20
  • ldexp(x, i)=Python中绝对误差 python误差函数_python_21
  • 求余数: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)=, log(x,y)=

坐标转化

转为极坐标polar,转为直角坐标rect

虚数函数

相位phase,模数(绝对值)abs

判断函数

isnanisinf,判断有限值isfinite

常量

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()了,其功能为返回一个Python中绝对误差 python误差函数_python_29区间的实数。接下来可以通过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中的分布函数均为浮点型。

分布函数

uniform(a,b)

[a,b]间均匀分布

triangular(a,b,mid)

三角分布

betavariate(a,b)

分布

expovariate(a)

指数分布

gammavariate(a,b)

分布

gauss(b,c)

正态分布

normalvariate(b,c)

正态分布,慢于gauss

lognormvariate(b,c)

对数正态分布

vonmisesvariate(a,b)

冯·米塞斯分布

paretovariate(a)

帕累托分布

weibullvariate(a,b)

韦伯分布

Python中绝对误差 python误差函数_statistics_43

Python中绝对误差 python误差函数_python_44

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

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

Python中绝对误差 python误差函数_Python中绝对误差_45

可以说十分正态了。

用于序列的随机函数

  • 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=

移位函数

adjusted 返回科学计数法的指数

相邻数字

next_minusnext_plus

双元运算,默认格式为a.xxx(b)

常规运算

remainder_near求余,quantize 乘方,a.scaleb(b)=

逻辑运算

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)=

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

上下文有歧义