# 数学函数
# import random
:Python 的标准库,用于生成随机数。
基于 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
方差的计算流程:
- 计算所有元素的算术平均值。
- 计算每个元素与算术平均值之差。
- 计算各个差的平方。(从而全部转换成绝对值,方便衡量分散程度)
- 计算这些平方的算术平均值。(先求和,然后除以元素总数 N )
方差用于衡量所有元素的分散程度。方差越大,说明所有元素越偏离算术平均值。
标准差是计算方差的平方根,从而让取值更接近算术平均值的数量级。
一般提到的方差,是指所有样本数据的总体方差,在最后一步是除以
N
。如果只对部分样本数据计算方差,则需要进行贝塞尔修正,在最后一步是除以N-1
。- 贝塞尔修正是指:假设
M
个样本呈正态分布,如果只提取N<M
个样本,则取出中间位置的样本的概率更大,取出边缘位置的样本的概率更小。因此分母为N
计算的方差,会比实际的总体方差偏小。需要将分母减小为N-1
,让计算结果偏大一点。
- 贝塞尔修正是指:假设