1.向量化的好处
首先进行一个简单的代码验证:
import numpy as np
import time
a = np.random.randn(1000000)
b = np.random.randn(1000000)
tic = time.time()
c = np.dot(a,b)
toc = time.time()
print(c)
print("Vectorized version:" + str(1000*(toc-tic)) + "ms") # 向量化的计算
c1 = 0
tic1 = time.time()
for i in range(1000000):
c1 += a[i] * b[i]
toc1 = time.time()
print(c1)
print("For loop:" + str(1000*(toc1-tic1)) + "ms") # 非向量化的计算
运行后得到的值:
显而易见,计算相同值的时候,向量化版本的计算所需要的时间远远低于非向量化版本的时间
因此我们在设计代码的时候,遇到for循环语句的相关代码,不妨先找找python-numpy库中是否有能够代替的
简单介绍一下c += a(i) * b(i),即c = c + a(i) * b(i) -= , /= ,*=同理(因为我一开始不知道hhh)
2.python中的部分广播
广播是python中的一种手段,可以让代码运行的更加快
用Python中的数组相加举例:
[1,2,3] [101,102,103] [1] [100,100,100] [101,101,101]
[2,3,4] + [100,100,100] = [102,103,104] [2] + [100,100,100] = [102,102,102]
[3,4,5] [103,104,105] [3] [100,100,100] [103,103,103]
大致为(m,n)的矩阵+-*/(1,n)python就会自动复制m次来使矩阵一一对应
例:
import numpy as np
A = np.array([[56.0,0.0,4.4,68.0],
[1.2,104.0,52.0,8.0],
[1.8,135.0,99.0,0.9]])
cal = A.sum(axis=0) # axis=0 为纵向相加,axis=1 为横向相加
percentage = 100*A/cal #亦可以= 100*A/cal.reshape(1,4) 不用reshape也是可以的
print(percentage)
虽然如此,但我们可以在代码中使用reshape来确保矩阵形状是自己想要的
3.向量化logistic回归的梯度输出
如图,按照右侧计算,我们就进行了一次没有用for循环的回归梯度下降的迭代了
小结:
在进行学习中不断进行汇总和将内容写到博客上也是一种高效的记忆方式,并可以时常回顾。