python 矩阵运算入门

313 阅读2分钟

概述

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 秒

可以发现,矩阵运算速度提高巨大