功能基础篇4——Python数学计算,数字、分数、数学库、随机数、统计

数学

numbers

数字抽象基类,Python标准库

from numbers import Number, Real, Rational, Integral

print(isinstance(1.0, Number))  # True
print(isinstance(1.0, Real))  # True
print(isinstance(1.0, Rational))  # False
print(isinstance(1.0, Integral))  # False

fractions

分数,Python标准库

from fractions import Fraction
from decimal import Decimal
from numbers import Rational

print(issubclass(Fraction, Rational))  # True Fraction直接继承Rational
print(Fraction(16, -10))  # -8/5
print(Fraction(123))  # 123/1
print(Fraction())  # 0/1
print(Fraction('3/7'))  # 3/7
print(Fraction(' -3/7 '))  # -3/7
print(Fraction('1.414213 \t\n'))  # 1414213/1000000
print(Fraction('-.125'))  # -1/8
print(Fraction('7e-6'))  # 7/1000000
print(Fraction(2.25))  # 9/4
print(Fraction(1.1))  # 2476979795053773/2251799813685248
print(Fraction("1.0"))  # 1/1
print(Fraction("1.1"))  # 11/10
print(Fraction(Decimal('1.1')))  # 11/10

math

数学函数(适用于实数范围),Python标准库,主要是基于C数学函数的封装

import math

# 向上取整
print(math.ceil(math.pi))  # 4
# 向下取整
print(math.floor(math.pi))  # 3
# 绝对值
print(math.fabs(-math.tau))  # 6.283185307179586

# 近似判断 abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) 
print(0.1 + 0.2 == 0.3,
      math.isclose(0.3, 0.1 + 0.2, rel_tol=0, abs_tol=1e-6))  # False True

# 无穷
print(math.isinf(-math.inf))  # True
print(math.isinf(float('inf')), math.inf == math.inf, math.inf is math.inf)  # True True True

# NaN
print(math.isnan(float('nan')), math.nan == math.nan, math.nan is math.nan)  # True False True

# 欧几里得距离 sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
print(math.dist([1, 2, 3, 4], [4, 3, 2, 1]))  # 4.47213595499958

cmath

数学函数(适用于复数范围),Python标准库,math的复数版本

decimal

高精度浮点计算,Python标准库

import decimal

print(decimal.Decimal('3.1415').quantize(decimal.Decimal('0.001')))
print(0.1 + 0.2 == 0.3)
print(decimal.Decimal('0.1') + decimal.Decimal('0.2') == decimal.Decimal('0.3'))
print(decimal.Decimal(0.1) + decimal.Decimal(0.2) == decimal.Decimal(0.3))

print(decimal.Decimal((1, [2, 3, 9], 3)))  # 2.39E+5
print(decimal.Decimal("0.3"))  # 0.3
print(decimal.Decimal(0.3))  # 0.299999999999999988897769753748434595763683319091796875
print(decimal.Decimal(1))  # 1
print(decimal.Decimal(1.75))  # 1.75 1.75是可以精确表示的
print(decimal.Decimal(decimal.Decimal(0.3)))  # 0.299999999999999988897769753748434595763683319091796875

注:使用不精确的浮点数创建出的Decimal对象也是不精确的

random

伪随机数,Python标准库

随机数由随机数生成器生成。伪随机数通常是以固定算法作为随机数生成器,如线性同余法,通过设定初始参数(通常指随机数种子)可以稳定复现随机数序列。准随机数,与伪随机数相比,伪随机数通过了大多随机性统计校验,准随机数没有通过大多随机性统计校验。真随机数是指以物理现象作为随机数生成器,如掷骰子、核裂变等,无法稳定复现随机数序列。

import random

# 伪随机数生成器,替换默认伪随机数生成器
# 此处指定随机数种子,则每次运行下面各个结果不变
print(random.Random(random.seed(0)))  # 
print([random.random() for i in range(3)])  # [0.8444218515250481, 0.7579544029403025, 0.420571580830845]

# 随机字节生成
print(random.randbytes(10))  # b':^HB\xfa\xb4(\xf7\xe2\x82'
print(len(random.randbytes(10)))

# 随机整数
print(random.randint(1, 10))  # 7
print(random.randrange(1, 10, 2))  # 1

# 随机实数
print(random.random())  # 0.25891675029296335
print(random.uniform(1, 10))  # 5.601472492317477

# 序列抽样
l = [1, '2', [3]]
print(random.choice(l))  # 随机抽取一个元素
print(random.sample(l, 2))  # ['2', [3]] 随机抽取两个元素
print(random.shuffle(l))  # None 原地打乱序列
print(l)  # [[3], 1, '2']

注:不应将random模块的伪随机生成器用于安全目的,可使用标准库secrets代替。

statistics

数据统计,Python标准库

import statistics

print(statistics.mean([1, 3, 2, 4, 5]))  # 3 算数平均值
print(statistics.geometric_mean([1, 3, 2, 4, 5]))  # 2.6051710846973517 几何平均数
print(statistics.median([1, 2, 4, 3, 5]))  # 3 中位数
print(statistics.mode([1, 2, 1, 4, 5]))  # 1 众数

注:由于浮点数NaN(not a number)不大于、不小于、不等于(包括NaN本身)任何数,或者说NaN大于或小于任何数,NaN与任何数或任何数与NaN进行任何关系运算结果均为False,会导致有NaN值的序列排序出现问题,间接影响需要排序再计算的函数,调用该类函数之前需要先过滤掉NaN值。

print(float('inf') > float('-inf'))  # True
print(float('nan') > float('inf'))  # False
print(float('nan') < float('-inf'))  # False
print(float('nan') > 0)  # False
print(float('nan') < 0)  # False
print(float('nan') == 0)  # False
print(float('nan') == float('nan'))  # False
import statistics
from math import isnan
from itertools import filterfalse

data1 = [20.7, float('NaN'), 19.2, 18.3, float('NaN'), 14.4]
data2 = list(filterfalse(isnan, data1))
print(sorted(data1))  # [20.7, nan, 14.4, 18.3, 19.2, nan]
print(sorted(data2))  # [14.4, 18.3, 19.2, 20.7]
print(statistics.median(data1))  # 16.35
print(statistics.median(data2))  # 18.75

NumPy

数组和矩阵运算,三方库

pip install numpy

SciPy

科学计算库,三方库,依赖于NumPy

pip install scipy

你可能感兴趣的:(Python高楼平地起,python,开发语言,科学计算,数学库)