Python内置数学模块全整理,易查易阅
文章目录
- math
- cmath
- statistics
- random
- fractions
- decimal
math
提供了一些基础的计算功能,下列表达式默认from math import *
,输入输出均为一个数字。
常见函数 | |
---|---|
三角函数 |
cos , sin , tan , acos , asin , atan
|
atan2(x,y) =arctanyx\arctan\frac{y}{x}arctanxy
|
|
双曲函数 |
cosh , sinh , tanh , acosh , asinh , atanh
|
幂函数 |
exp , sqrt , expm1(x) =ex−1e^x-1ex−1, pow(x,y) =xyx^yxy
|
对数函数 |
log , log10 , log2 , log1p(x) =ln(1+x)\ln(1+x)ln(1+x)
|
log(x) =lnx\ln xlnx, log(x,y) =logyx\log_yxlogyx
|
|
取整 |
向上ceil , 向下floor ,实值向下取整trunc
|
isqrt(x) 相当于floor(sqrt(x))
|
|
角度转换 |
转角度degrees ,转弧度radians
|
拆分 |
a,b = modf(x) 即x=a.b,a,b=frexp(x) 即x=a⋅2bx=a\cdot2^bx=a⋅2b
|
其他函数 |
阶乘factorial ,绝对值fabs ,最小有效比特位的值ulp
|
特殊函数 | |
---|---|
erf(x)
|
误差函数,2π∫0xe−η2dη\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+∞tx−1t−tdt(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π | eee | τ=2π\tau=2\piτ=2π | inf\infinf | nan |
---|---|---|---|---|---|
值 | 3.14… | 2.71… | 6.28… | 正无穷 | 非数字 |
代码 |
pi
|
e
|
tau
|
inf
|
nan
|
输入 | 输入为任意多个数值的函数 |
---|---|
整数 |
最大公约数gcd ,最小公倍数lcm
|
数值 |
精确求和fsum , 欧几里得范数hypot (可理解为均方根)
|
连乘prod ,可选参数start 表示初始值
|
其他函数
comb(n,k)
=Cnk=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(pi−qi)2\sum_i(p_i-q_i)^2∑i(pi−qi)2ldexp(x, i)
=x⋅2ix\cdot 2^ix⋅2i- 求余数:
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) =lnz\ln zlnz, log(x,y) =logyx\log_yxlogyx
|
坐标转化 |
转为极坐标polar ,转为直角坐标rect
|
虚数函数 |
相位phase ,模数(绝对值)abs
|
判断函数 |
isnan ,isinf ,判断有限值isfinite
|
常量 | π\piπ | eee | τ=2π\tau=2\piτ=2π | inf\infinf | iinf\text i\infiinf | 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
就派上了用场。
相比之下,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)xa−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−axx>0a\cdot e^{-ax}\quad x>0a⋅e−axx>0 |
gammavariate(a,b)
|
γ\gammaγ分布 | xa−1exp(−xb)Γ(a)∗ba\frac{x^{a-1}\exp(\frac{-x}{b})}{\Gamma(a)*b^a}Γ(a)∗baxa−1exp(b−x) |
gauss(b,c)
|
正态分布 | 12πcexp(x−b)22c2\frac{1}{\sqrt{2\pi}c}\exp\frac{(x-b)^2}{2c^2}2πc1exp2c2(x−b)2 |
normalvariate(b,c)
|
正态分布,慢于gauss | 12πcexp(x−b)22c2\frac{1}{\sqrt{2\pi}c}\exp\frac{(x-b)^2}{2c^2}2πc1exp2c2(x−b)2 |
lognormvariate(b,c)
|
对数正态分布 | 1cx2πexp(lnx−b)22c2\frac{1}{cx\sqrt{2\pi}}\exp\frac{(\ln x-b)^2}{2c^2}cx2π1exp2c2(lnx−b)2 |
vonmisesvariate(a,b)
|
冯·米塞斯分布 | exp[bcos(x−a)2πJ0(b)]\exp[\frac{b\cos(x-a)}{2\pi J_0(b)}]exp[2πJ0(b)bcos(x−a)] |
paretovariate(a)
|
帕累托分布 | x−ax^{-a}x−a |
weibullvariate(a,b)
|
韦伯分布 | ba(xa)b−1exp[−(xa)b]\frac{b}{a}(\frac{x}{a})^{b-1}\exp[-(\frac{x}{a})^b]ab(ax)b−1exp[−(ax)b] |
注:
Γ(x)=∫0+∞tz−1e−tdt(x>0)\Gamma(x)=\int^{+\infty}_0t^{z-1}e^{-t}\text dt\quad(x>0)Γ(x)=∫0+∞tz−1e−tdt(x>0)
J0(x)=∑m=0∞(−1)mm!Γ(m+1)(x2)2mJ_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中选择一个子列表
- 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
|
---|---|---|
虚部 | 实部 |
函数 | |
---|---|
返回自身 |
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 =ab\frac{a}{b}ba
|
移位函数 |
adjusted 返回科学计数法的指数
|
相邻数字 |
next_minus ,next_plus
|
双元运算,默认格式为a.xxx(b)
|
|
---|---|
常规运算 |
remainder_near 求余,quantize 乘方,a.scaleb(b) =a×10ba\times10^ba×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∣ba\frac{|b|}{b}ab∣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
|
上下文有歧义 |
Python内置数学模块全整理,易查易阅相关推荐
- python内置collections模块的使用
python内置collections模块的使用 文章目录: 一.collections模块说明 1.查看collections模块的定义路径 2.查看collections文档介绍信息 3.查看co ...
- Python 内置时间模块:Calendar
Python 内置的日历( calendar )模块主要输出跟日历相关的内容,相对 datetime 和 time 模块来说, calendar 模块的功能要简单些. 最常用的两个功能是输出某年的日历 ...
- Python内置time模块中,time.time()函数和time.sleep()函数的用法
time模块 time模块是Python内置模块,能让Python程序读取系统时钟的当前使时间.在time模块中,time.time( ) 和time.sleep( )函数是最常用和最有用的模块. t ...
- python内置json模块的作用_json和simplejson Python模块之间有什么区别?
我不同意其他答案:内置json库(在Python 2.7中)不一定比它慢simplejson.它也没有这个讨厌的unicode bug. 这是一个简单的基准:import jsonimport sim ...
- python内置json模块的作用_python详解json模块
我们在做工作中经常会使用到json模块,今天就简单介绍下json模块 什么是json JSON ,全称为JavaScript Object Notation, 也就是JavaScript 对象标记,它 ...
- python内置json模块_python的常用内置模块之序列化模块json
#什么叫序列化--将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. '''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文 ...
- python测试脚本 进制转换器_使用Python内置的模块与函数进行不同进制的数的转换...
binascii 模块:它包含一个把二进制数值转换成十六进制的函数,同样也可以反过来转. #binary_value是二进制数值不是字符串,也不是int型的1010 binascii.b2a_hex( ...
- Python 内置turtle模块 —— 画一面国旗(基础篇)
# 用 turtle模块 画一面国旗""" 思考:1.怎么导入和使用 turtle模块?2.你对 turtle模块 了解有多少?介绍:1.turtle模块 是一个很强大的 ...
- python内置数学函数库_在没有任何内置的求值函数或外部库的情况下用python解决数学问题...
有趣的问题,这里有一个潜在的解决方案.毫无疑问,您可以使用库或lambdas等来创建一个更优雅的解决方案,就像fourtheye在他们的答案中所做的那样,但是这似乎是有效的.在 我在底部做了一些测试用 ...
- Python内置GUI模块Tkinter的几点笔记
组件属性,用法 组件位置 更多 转载于:https://www.cnblogs.com/sqdtss/p/9439301.html
最新文章
- c++ 界面交互影响处理代码执行速度_原创 | 某SCADA的远程代码执行漏洞挖掘与利用...
- 安装SQL Server 2012示例数据库
- 2048c语言程序,C语言实现2048小游戏
- python 获取指定目录下的图片文件
- 项目管理:软件工程相关知识笔记
- pycharm入门的简易使用教程
- asp.net删除cookie
- 【转】一个小妙招能让你在服装上省下好多rmb
- 公交车宜配备逃生绳索
- TM1640的驱动及代码
- 什么是黑客?郭盛华告诉你
- folder汇总字段的实现
- 油菜花系统服务器能删除内容吗,油菜花期蜂群管理要点
- jNs 在 ASP.NET MVC 项目中的应用
- 从管理的角度分享技术 TL 的核心职责:包括沟通与辅导、招聘与解雇等
- 虚拟机M0n0wall软件防火墙配置
- libyuv接口NV12ToI420的实际使用
- 如何在Mac和iPhone或iPad之间同步音乐?
- 为什么离不开 Stackoverflow
- linux下载gitlab文件,Linux下安装Gitlab10(修正版)
热门文章
- 计算机磁盘修复工具,电脑自带chkdsk磁盘修复工具使用教程
- LinkedIn登录第三方网站
- SQL语句——查询语句
- 扇贝编程python骗局-原来用Python薅羊毛这么简单!后悔错过了那么多机会
- USB转TTL、USB转232的区别
- Java编译运行命令
- 超级精简版/超精简/懂你版IDM 6.25 build 23推荐
- java 强制转换double_JAVA强制类型转换
- 清明小长假不无聊:分享一大波影视网站和APP,轻松看全网视频
- 中国移动计算机类行测题目,2021三大运营商春招笔试:中国移动行测练习题(2)...