文章目录

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

math

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

常见函数
三角函数 cos, sin, tan, acos, asin, atan
atan2(x,y)=arctan⁡yx\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)=ln⁡x\ln xlnx, log(x,y)=log⁡yx\log_yxlogy​x
取整 向上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​∫0x​e−η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∣b​
  • dist(p,q)=∑i(pi−qi)2\sum_i(p_i-q_i)^2∑i​(pi​−qi​)2
  • ldexp(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)=ln⁡z\ln zlnz, log(x,y)=log⁡yx\log_yxlogy​x
坐标转化 转为极坐标polar,转为直角坐标rect
虚数函数 相位phase,模数(绝对值)abs
判断函数 isnanisinf,判断有限值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就派上了用场。

相比之下,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]∣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π​c1​exp2c2(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π​c1​exp2c2(x−b)2​
lognormvariate(b,c) 对数正态分布 1cx2πexp⁡(ln⁡x−b)22c2\frac{1}{cx\sqrt{2\pi}}\exp\frac{(\ln x-b)^2}{2c^2}cx2π​1​exp2c2(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
虚部 实部
函数
返回自身 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=ab\frac{a}{b}ba​
移位函数 adjusted 返回科学计数法的指数
相邻数字 next_minusnext_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_signalcompare_totalcompare_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中,通过上下文对象来管理精度、舍入规则等,可通过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内置数学模块全整理,易查易阅相关推荐

  1. python内置collections模块的使用

    python内置collections模块的使用 文章目录: 一.collections模块说明 1.查看collections模块的定义路径 2.查看collections文档介绍信息 3.查看co ...

  2. Python 内置时间模块:Calendar

    Python 内置的日历( calendar )模块主要输出跟日历相关的内容,相对 datetime 和 time 模块来说, calendar 模块的功能要简单些. 最常用的两个功能是输出某年的日历 ...

  3. Python内置time模块中,time.time()函数和time.sleep()函数的用法

    time模块 time模块是Python内置模块,能让Python程序读取系统时钟的当前使时间.在time模块中,time.time( ) 和time.sleep( )函数是最常用和最有用的模块. t ...

  4. python内置json模块的作用_json和simplejson Python模块之间有什么区别?

    我不同意其他答案:内置json库(在Python 2.7中)不一定比它慢simplejson.它也没有这个讨厌的unicode bug. 这是一个简单的基准:import jsonimport sim ...

  5. python内置json模块的作用_python详解json模块

    我们在做工作中经常会使用到json模块,今天就简单介绍下json模块 什么是json JSON ,全称为JavaScript Object Notation, 也就是JavaScript 对象标记,它 ...

  6. python内置json模块_python的常用内置模块之序列化模块json

    #什么叫序列化--将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. '''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文 ...

  7. python测试脚本 进制转换器_使用Python内置的模块与函数进行不同进制的数的转换...

    binascii 模块:它包含一个把二进制数值转换成十六进制的函数,同样也可以反过来转. #binary_value是二进制数值不是字符串,也不是int型的1010 binascii.b2a_hex( ...

  8. Python 内置turtle模块 —— 画一面国旗(基础篇)

    # 用 turtle模块 画一面国旗""" 思考:1.怎么导入和使用 turtle模块?2.你对 turtle模块 了解有多少?介绍:1.turtle模块 是一个很强大的 ...

  9. python内置数学函数库_在没有任何内置的求值函数或外部库的情况下用python解决数学问题...

    有趣的问题,这里有一个潜在的解决方案.毫无疑问,您可以使用库或lambdas等来创建一个更优雅的解决方案,就像fourtheye在他们的答案中所做的那样,但是这似乎是有效的.在 我在底部做了一些测试用 ...

  10. Python内置GUI模块Tkinter的几点笔记

    组件属性,用法 组件位置 更多 转载于:https://www.cnblogs.com/sqdtss/p/9439301.html

最新文章

  1. c++ 界面交互影响处理代码执行速度_原创 | 某SCADA的远程代码执行漏洞挖掘与利用...
  2. 安装SQL Server 2012示例数据库
  3. 2048c语言程序,C语言实现2048小游戏
  4. python 获取指定目录下的图片文件
  5. 项目管理:软件工程相关知识笔记
  6. pycharm入门的简易使用教程
  7. asp.net删除cookie
  8. 【转】一个小妙招能让你在服装上省下好多rmb
  9. 公交车宜配备逃生绳索
  10. TM1640的驱动及代码
  11. 什么是黑客?郭盛华告诉你
  12. folder汇总字段的实现
  13. 油菜花系统服务器能删除内容吗,油菜花期蜂群管理要点
  14. jNs 在 ASP.NET MVC 项目中的应用
  15. 从管理的角度分享技术 TL 的核心职责:包括沟通与辅导、招聘与解雇等
  16. 虚拟机M0n0wall软件防火墙配置
  17. libyuv接口NV12ToI420的实际使用
  18. 如何在Mac和iPhone或iPad之间同步音乐?
  19. 为什么离不开 Stackoverflow
  20. linux下载gitlab文件,Linux下安装Gitlab10(修正版)

热门文章

  1. 计算机磁盘修复工具,电脑自带chkdsk磁盘修复工具使用教程
  2. LinkedIn登录第三方网站
  3. SQL语句——查询语句
  4. 扇贝编程python骗局-原来用Python薅羊毛这么简单!后悔错过了那么多机会
  5. USB转TTL、USB转232的区别
  6. Java编译运行命令
  7. 超级精简版/超精简/懂你版IDM 6.25 build 23推荐
  8. java 强制转换double_JAVA强制类型转换
  9. 清明小长假不无聊:分享一大波影视网站和APP,轻松看全网视频
  10. 中国移动计算机类行测题目,2021三大运营商春招笔试:中国移动行测练习题(2)...