python中的常见数学计算

前言:被GPT惯坏后完整代码复现写不了一点 -> 开启从0开始的python数学表达x

一.常规计算(math库为主)

1.绝对值

# 求x的绝对值 abs(x) 或 math.fabs(x)
print(abs(-4))

2.幂计算

# x的y次方 x**y
# a = 16
a = 2**4
print(a)
# 自然数e的x次幂 math.exp(x) 返回e的x次幂-1 math.expml(x)
print(math.exp(3))

3.开平方

import math
# 求x的平方根 math.sqrt(a)
a = 16
b = math.sqrt(a) 
print(b)

4.对数

import math
# 以x为底y的对数 math.log(x,y)
# 输出 lg2
print(math.log(10,2))
# 特殊 以2为底 math.log2(x) 以10为底 math.log10(x)

5.取整

import math
# 向上取整 math.ceil(x)  向下取整 math.floor(x) 
# 四舍五入 round(x) 
# 取x的整数部分 math.trunc(x) 【取小数部分 math. modf(x)】
print(math.ceil(4.4))
print(math.floor(4.4))
print(math.trunc(4.4))
print(round(4.4))
# 输出 5 4 4 4

6.三角函数值计算

import math
# 弧度角度切换 弧->角 math.degree(x) 角->弧 math.radians(x)
print(math.degree(1))
# 弧度制x 求正弦/余弦/正切  修改三角函数名即可 math.sin(x)

# 反三角函数 函数名前加a eg: math.asin(x)
# angle = 45°
angle=math.pi/4 
print("sin(45°)=",math.sin(angle))
print("cos(45°)=",math.cos(angle))
print("tan(45°)=",math.tan(angle))

二.特殊公式

1.阶乘

import math
# x的阶乘 math.factorial(x)
# 计算5的阶乘
print(factorial(5))

2.待补充

三.其他计算(numpy库为主)

1.numpy数组生成

import numpy as np
# 直接输入 np.array()
a = np.array([[1,2,3], [4, 5, 6]], dtype=int)
# 一维->二维 eg:1*10 -> 2*5
b = np.arange(10).reshape(2, 5) 
# 输出数组维度 numpy.ndim() 输出数组形状(规模) numpy.shape()

# 随机生成 
# np.random.rand(x,y) 或 np.random.randn(x,y)
# 或 np.random.randint(low,high,size,dtype) 可指定上下限 维度 类型
"""
注释:
随机数模块np.random.random, np.random.randn, np.random.rand的比较
(1)rand 生成均匀分布的伪随机数,分布在(0~1)之间
(2)randn 生成标准正态分布的伪随机数(均值为0,方差为1)【生成可能有负值】
"""
c = np.random.random(2,3)

# 特殊结构数列
# 全0数组 np.zeros(x,y) x*y大小的全0数组
print(np.zeros(3,4))
# 全1数组 np.ones(x,y)
# n阶单位矩阵 np.eye(n)
# 等差数列 np.linspace(a,b,c) 从a到b等间隔取五个数构成数组
print(np.linspace(0,20,5))
# 等差数列 np.arrange(a,b,c) 从a到b-1构造步长(差)为c的数组
print(np.arange(1, 20, 2))

# 形状变换
# np.reshape(x,y) 将数组变为x行y列
# np.ravel() np.flatten()将数组变成一维
"""
注释:
(1)reshape() 返回原始数组的视图
(2)ravel() 返回原始数据的视图或者副本,只有在参数order = ‘F’时返回副本
(3)flatten() 返回原始数组的副本
"""

#数组分割 
# 按列 np.hsplit(array,[x,y]) 从第x列 第y列 分割
# 按行 np.vsplit(array,[x,y]) 从第x行 第y行 分割
#返回为列表list 其中的每一个元素是划分后的数组

# 数组合并【注意规模问题】 
#横向 numpy.hstack(x,y) 或 np.concatenate(x,y,axis = 1) 或 np.column_stack()
np.hstack((a, a))
#纵向 numpy.vstack(x,y) 或 np.concatenate(x,y,axis = 0) 或 np.row_stack()
"""
注释:
准确来说np.concatenate(x,y,axis = z)是在第z维固定的基础上进行合并
"""

2.部分索引

# 多维数组的索引
b = np.arange(20).reshape(5,4)
# 输出第(x,y)个元素 b[x,y]
b[2,3]
# 输出第y行前x+1个元素 b[0:x, y] 列同理 
b[0:5, 1]
# 整行赋值举例
b1 = b.copy()
b1[:1,:]=0
# 输出第x行元素 b[:, x] 列同理
b[ : ,1]
#注意!当少于轴数的索引被提供时,缺失部分默认取所有
b[-1] # = b[-1,:]
"""
NumPy也允许你使用“点”像 b[i,...] 点 (…)代表许多产生一个完整的索引元组必要的分号
eg:x是秩为5的数组(即它有5个轴)
x[1,2,…] = x[1,2,:,:,:]
x[…,3] = x[:,:,:,:,3]
x[4,…,5,:] = x[4,:,:,5,:]
"""

# 返回每行最大值索引 arr.argmax(axis=1) 每列 arr.argmax(axis=0)

# 迭代中的索引
# 默认遍历第一个轴 想遍历全部元素可以将数组转为一维
h = np.arange(12).reshape(3,4)
for i in h:
   print(i)
# 遍历全部
for i in h.flat:
print(i)  
# np.flatten() 也能返回折叠后的一维数组 但对象不能为list

3.矩阵特征计算

# 数组求和 np.sum() 按列求和 np.sum(axis=0) eg: a.sum()
# 均值计算 列 np.mean(axis=0) 行 np.mean(axis=1) eg: a.mean()
# 数组方差 np.var() 标准差 np.std() 
# 数组转置 np.T() 或 np.transpose() eg: a.T()
# 数组求逆 np.linalg.inv(array)
# 求行列式 np.linalg.det() 得到det(A)
np.linalg.det(a)
# 特征值与特征向量 np.linalg.eig() 输出 特征值构成的矩阵 和 特征向量构成的矩阵
# 奇异值分解 np.linalg,svd(array) 输出 u 左奇异向量 s 奇异值 v 右奇异向量
A = np.array([[4, 0], [3, -5]])
U, S, V = np.linalg.svd(A)
print(U)
print(S)
print(V)

4.范数计算

L1范数 向量中各元素绝对值之和

L2范数 向量中各个元素平方求和再开方

无穷范数 取向量中所有元素绝对值最大值

import numpy as np
# 定义矩阵
a=[[1,2,0],[-1,2,-1],[0,1,1]]
A=np.array(a)
# 范数计算 1范数 2范数 无穷范数
a1=np.linalg.norm(A,ord=1)
a2=np.linalg.norm(A,ord=2)
a3=np.linalg.norm(A,ord=np.Inf)  
print("第一范数为",a1)
# 保留两位
print("第二范数为",round(a2,2))
print("无穷范数为",a3)

5.距离计算

常用库

import numpy as np
from scipy.spatial import distance

曼哈顿距离

又名城市街区距离,指在一个网格状的城市街区中从一个点到另一个点沿着直角路径所经过的格子数(只能上下左右测量的距离)

np.sum(np.abs(arr1 - arr2))

欧氏距离(“直线”距离)

np.sqrt(np.sum((arr1 - arr2) ** 2))

切比雪夫距离

两向量之间的距离定义为其各维度对齐后数值差的最大值

np.max(np.abs(arr1 - arr2))

闵可夫斯基距离

不同阶数的闵可夫斯基距离:阶数1 曼哈顿距离 阶数2 欧氏距离 阶数3 切比雪夫距离

(向量的L-P范数可以看做是y向量为0的闵可夫斯基距离的特例)

import numpy as np
def minkowski_distance(x, y, p):
    import math
    import numpy as np
    xy= zip(x, y)
    return math.pow(np.sum([math.pow(np.abs(i[0]-i[1]), p) for i in xy]), 1/p)
 
x = [1, 3, 5]
y = [2, 4, 6]
print('x-y:',minkowski_distance(x, y, 3))
print('y-x:',minkowski_distance(y, x, 3))