# 数学函数

# import random

:Python 的标准库,用于生成随机数。

  • 官方文档 (opens new window)

  • 基于 Mersenne Twister 算法生成为伪随机数。

    • 生成速度快,但是生成的随机数可能被预测,安全性低,因此不适合用作密码。
    • 用户想生成密码时,建议调用 os.urandom(<int>) 生成一段指定长度的 bytes ,取值随机,更安全。
  • 例:生成随机数

    >>> import random
    >>> random.randint(1, 10)       # 生成一个在闭区间 [1, 10] 内的数(上下限只能是整数)
    3
    >>> random.randrange(1, 10, 2)  # 生成一个在闭区间 [1, 10] 内、步进值为 2 的数(上下限只能是整数)
    5
    >>> random.uniform(1, 5.4)      # 生成一个在闭区间 [1, 10] 内的数(上下限可以是整数、浮点数)
    5.254084551261407
    
  • 例:从序列中随机选取一项元素

    >>> random.choice('Hello')
    'e'
    >>> random.choices('Hello', k=3)  # 选取 k 个元素(可能重复)
    ['H', 'e', 'e']
    >>> random.choices('Hello', [1,2,3,4,50]) # 指定权重
    ['o']
    
  • 例:随机改变序列中的元素顺序

    >>> L1 = [1, 2, 3, 4]
    >>> random.shuffle(L1)
    >>> L1
    [3, 4, 2, 1]
    

# import math

:Python 的标准库,提供了幂运算、三角函数等数学函数。

  • 官方文档 (opens new window)
  • 这些函数支持输入 int、float 类型的数值,返回值大多为 float 类型。
  • Python 的标准库 cmath 也提供了类似的数学函数,支持输入 int、float、complex 类型的数值,返回值大多为 complex 类型。

# 常量

>>> import math
>>> math.e
2.718281828459045
>>> math.pi
3.141592653589793
>>> math.isinf(x)       # 判断 x 是否为 float('±inf')
False
>>> math.isnan(x)       # 判断 x 是否为 float('nan')
False
>>> math.isfinite(x)    # 判断 x 是否为有限的数值,即不是 float('±inf')、float('nan')
True

# 取整

>>> math.ceil(x)    # 向上取整(ceiling),即大于等于 x 的最近整数
4
>>> math.floor(x)   # 向下取整(floor),即小于等于 x 的最近整数
3

# 幂运算

>>> x = 3.14
>>> math.pow(2, 0.5)    # 计算 2**0.5
1.4142135623730951
>>> math.sqrt(2)        # 计算平方根
1.4142135623730951
>>> math.exp(x)         # 计算 e^x
23.103866858722185

# 对数

>>> math.log(x)         # 计算对数,函数定义为 log(x, base=math.e)
1.144222799920162
>>> math.log(x, x)
1.0

# 角度与弧度

>>> math.radians(180)   # 将角度转换成弧度
3.141592653589793
>>> math.degrees(3.14)  # 将弧度转换成角度
179.9087476710785

# 三角函数

>>> math.sin(x)         # 正弦
0.0015926529164868282
>>> math.cos(x)         # 余弦
-0.9999987317275395
>>> math.tan(x)         # 正切
-0.001592654936407223
>>> math.asin(x)        # 反正弦
ValueError: math domain error
>>> math.acos(x)
ValueError: math domain error
>>> math.atan(x)
1.2624806645994682

# 双曲函数

>>> math.sinh(x)
11.53029203041011
>>> math.cosh(x)
11.573574828312076
>>> math.tanh(x)
0.9962602049458319
>>> math.asinh(x)
1.8618125572133835
>>> math.acosh(x)
1.810991348900196
>>> math.atanh(x)
ValueError: math domain error

# import statistics

:Python 的标准库,用于对一组数值进行统计分析,比如计算平均值、方差。

  • 官方文档 (opens new window)
  • 虽然 Python 存在 max()、min()、sum() 等内置函数,用于统计分析。但 statistics 模块提供了更多函数。
  • statistics 模块的大部分函数,要求输入一个可迭代对象,迭代的每个元素都是一个数值,可以是 int、float、Decimal、Fraction 类型。

# 中位数

  • 例:

    >>> import statistics
    >>> statistics.median([1, 2, 3])    # 如果输入的元素总数为奇数,则返回中间那个数
    2
    >>> statistics.median([1, 2, 3, 4]) # 如果输入的元素总数为偶数,则返回中间两个数的算术平均值
    2.5
    
  • 上例返回的算术平均值,在用户输入的元素中不存在。如果用户希望在输入的元素之中选出一个中位数,则可以调用以下函数:

    >>> statistics.median_low([1, 2, 3, 4])   # 返回中间两个数中,取值较小的那个数
    2
    >>> statistics.median_high([1, 3, 2, 4])  # 返回中间两个数中,取值较大的那个数
    3
    >>> statistics.median_high([1, 3, 2])     # 输入的元素总数为奇数时,该函数不能正常工作
    2
    

# 众数

  • 例:
    >>> statistics.mode([1, 2, 2, 3, 3])      # 返回出现次数最多的那个元素。如果多个元素的出现次数并列第一,则返回其中第一个元素
    2
    >>> statistics.multimode([1, 2, 2, 3, 3]) # 如果多个元素的出现次数并列第一,则依次返回这些元素
    [2, 3]
    
  • 另外,使用 collections 标准库的 Counter ,可以统计每个元素的出现次数。

# 平均值

  • 算术平均值:

    >>> import statistics
    >>> statistics.mean(range(6))
    2.5
    >>> statistics.mean([])       # 如果可迭代对象不包含任何元素,则抛出异常
    statistics.StatisticsError: mean requires at least one data point
    
  • 几何平均值(先将所有数相乘,然后计算乘积的平方根):

    >>> statistics.geometric_mean(range(1, 6))
    2.6051710846973517
    >>> statistics.geometric_mean(range(6))     # 要求输入的每个元素,都是正数,否则抛出异常
    statistics.StatisticsError: geometric mean requires a non-empty dataset  containing positive numbers
    

# 方差

  • 例:

    >>> statistics.pvariance(range(100))    # 总体方差
    833.25
    >>> statistics.pstdev(range(100))       # 总体标准差
    28.86607004772212
    >>> statistics.variance(range(100))     # 样本方差
    841.6666666666666
    >>> statistics.stdev(range(100))        # 样本标准差
    29.011491975882016
    
  • 方差的计算流程:

    1. 计算所有元素的算术平均值。
    2. 计算每个元素与算术平均值之差。
    3. 计算各个差的平方。(从而全部转换成绝对值,方便衡量分散程度)
    4. 计算这些平方的算术平均值。(先求和,然后除以元素总数 N )
  • 方差用于衡量所有元素的分散程度。方差越大,说明所有元素越偏离算术平均值。

  • 标准差是计算方差的平方根,从而让取值更接近算术平均值的数量级。

  • 一般提到的方差,是指所有样本数据的总体方差,在最后一步是除以 N 。如果只对部分样本数据计算方差,则需要进行贝塞尔修正,在最后一步是除以 N-1

    • 贝塞尔修正是指:假设 M 个样本呈正态分布,如果只提取 N<M 个样本,则取出中间位置的样本的概率更大,取出边缘位置的样本的概率更小。因此分母为 N 计算的方差,会比实际的总体方差偏小。需要将分母减小为 N-1 ,让计算结果偏大一点。