概述
python 当中,在一些场景下,把循环替换位矩阵运算,可以极大的提高程序的运行速度。
相关知识点
-
meshgrid:把一维数组转化为高维数组
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([11,12,13,14,15])
xv,yv=np.meshgrid(a,b,indexing='xy')
print(xv)
print(yv)
############################################
xv 的结果为:
[[1 2 3 4 5]
[1 2 3 4 5]
[1 2 3 4 5]
[1 2 3 4 5]
[1 2 3 4 5]]
yv 的结果为:
[[11 11 11 11 11]
[12 12 12 12 12]
[13 13 13 13 13]
[14 14 14 14 14]
[15 15 15 15 15]]
##############################################
-
矩阵转置
# 接着上面的代码,进行矩阵的转置
xv_T = xv.T
print(xv_T)
##############################################
xv_T的结果为:
[[1 1 1 1 1]
[2 2 2 2 2]
[3 3 3 3 3]l
[4 4 4 4 4]
[5 5 5 5 5]]
-
三角矩阵:上三角矩阵——triu,下三角矩阵tril
xv_triu=np.triu(xv,0)
xv_tril=np.tril(xv,0)
print(xv_triu)
print(xv_tril)
##############################################
xv_triu 的结果为:
[[1 2 3 4 5]
[0 2 3 4 5]
[0 0 3 4 5]
[0 0 0 4 5]
[0 0 0 0 5]]
xv_tril的结果为:
[[1 0 0 0 0]
[1 2 0 0 0]
[1 2 3 0 0]
[1 2 3 4 0]
[1 2 3 4 5]]
计算例子
对于上图所示的公式,假设如下:
c的取值范围为:[1011,12,13,14,15,16,17,18,19]
对应的H(i)的取值为:[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]
用循环来对上述公式的内容进行表达:
c=[i+10 for i in range(0,10)] #这里 +10 是为了避免0的出现
H=[i*0.1 for i in range(1,11)]
fai_arr=[]
for i in range(0,10):
denominator=0
numerator=0
if i ==0:
numerator=numerator+(c[0]-c[0])*H[0]
denominator=denominator+c[0]*H[0]
else:
for j in range(0,i+1):
numerator=numerator+(c[i]-c[j])*H[j]
denominator=denominator+c[i]*H[j]
fai_arr.append(numerator/denominator)
fai_arr = [float('{:.2f}'.format(i)) for i in fai_arr] #保留小数点后2位print(fai_arr)
####################################################
fai_arr的打印结果为:
[0.0, 0.03, 0.06, 0.08, 0.1, 0.11, 0.12, 0.14, 0.15, 0.16]
用矩阵运算来对上述公式内容进行表达:
import numpy as np
c=np.array([i+10 for i in range(0,10)])
H=np.array([i*0.1 for i in range(1,11)])
xv,yv=np.meshgrid(c,c,indexing = 'xy')
x_y=xv-yv
numerator_mtrix=(x_y.T*H).T
numerator_mtrix[numerator_mtrix<=0]=0
sum_numerator_mtrix=np.sum(numerator_mtrix,axis=0)
denominator_mtrix=np.triu((yv*H).T,0)
sum_denominator_mtrix=np.sum(denominator_mtrix,axis=0)
fai_arr=(sum_numerator_mtrix/sum_denominator_mtrix).tolist()
fai_arr = [float('{:.2f}'.format(i)) for i in fai_arr]
print(fai_arr)
######################################################fai_arr的打印结果位:
[0.0, 0.03, 0.06, 0.08, 0.1, 0.11, 0.12, 0.14, 0.15, 0.16]
当这个数组数量变大,比如变大到10000时候,
前者采用for循环在我的电脑上运行耗时为:0.4088172912597656 秒
后者采用矩阵运算在我的电脑上运行耗时为:0.02899909019470215 秒
可以发现,矩阵运算速度提高巨大