所有的编程语言都离不开循环。所以默认情况下,只要有重复操作,我们就会开始执行循环。但是当我们处理大量迭代(数百万/数十亿行)时,使用循环是一种犯罪。您可能会被困几个小时,然后才意识到它不起作用。这就是python中的矢量化变得非常关键的地方。什么是矢量化?矢量化是一种用于在数据集上实现(NumPy)数组操作的技术。在幕后,它一次将操作应用于数组或系列的所有元素(与一次操作一行的“for”循环不同)。接下来我们使用一些用例来演示什么是矢量化。查找数字的总和##Useloopimporttimestart=time.time()#iterativesumtotal=0#迭代150万个数字foriteminrange(0,1500000):total=total+itemprint('sumis:'+str(total))end=time.time()print(end-start)#1124999250000#0.14Seconds##usevectorizationimportnumpyasnpstart=time.time()#vectorizedsum-使用numpy进行矢量化#np.arange创建从0到1499999的数字序列print(np.sum(np.arange(1500000)))end=time.time()print(end-start)##1124999250000##0.008秒与使用范围函数的迭代相比,矢量化的执行时间减少了大约18倍。当使用PandasDataFrames时,这种差异变得更加明显。数学运算在数据科学中,当使用PandasDataFrames时,开发人员使用循环通过数学运算创建新的派生列。在下面的示例中,我们可以看到在此类用例中用矢量化替换循环是多么容易。DataFrame是行和列形式的表格数据。我们创建一个具有500万行和4列的pandasDataFrame,其中填充了0到50之间的随机值。importnumpyasnpimportpandasaspddf=pd.DataFrame(np.random.randint(0,50,size=(5000000,4)),columns=('a','b','c','d'))df.shape#(5000000,5)df.head()创建一个新列“ratio”以找到“d”和“c”列的比率。##循环importtimestart=time.time()#使用iterrows遍历DataFrameforidx,rowindf.iterrows():#创建新列df.at[idx,'ratio']=100*(row["d"]/row["c"])end=time.time()print(end-start)###109秒##使用矢量化start=time.time()df["ratio"]=100*(df["d"]/df["c"])end=time.time()print(end-start)###0.12seconds我们可以看到DataFrame与Python中的循环相比有显着改进,矢量化操作速度几乎快了1000倍。If-else语句我们实现了很多需要我们使用“If-else”类型逻辑的操作。我们可以轻松地将这些逻辑替换为python中的矢量化操作。让我们看下面的例子来更好地理解它(我们将使用我们在用例2中创建的DataFrame):假设我们要根据现有列“a”的某些条件创建一个新列“e”##使用循环导入timestart=time.time()#使用iterrows遍历DataFrameforidx,rowindf.iterrows():ifrow.a==0:df.at[idx,'e']=row.delif(row.a<=25)&(row.a>0):df.at[idx,'e']=(row.b)-(row.c)else:df.at[idx,'e']=row.b+row.cend=time.time()print(end-start)###耗时:166秒##vectorizationstart=time.time()df['e']=df['b']+df['c']df.loc[df['a']<=25,'e']=df['b']-df['c']df.loc[df['a']==0,'e']=df['d']end=time.time()print(end-start)##0.29007707595825195秒向量与带有if-else语句的python循环相比600次简化操作所需的时间更快。解决机器学习/深度学习网络深度学习需要我们解决多个复杂的方程式,需要解决数百万和数十亿行的问题。在Python中运行循环来求解这些方程式非常慢,矢量化是最好的解决方案。例如,计算以下多元线性回归方程中数百万行的y值:我们可以用向量化代替循环。m1,m2,m3...的值是通过用x1,x2,x3...对应的百万个值求解上式来确定的importnumpyasnp#设置m的初始值m=np.随机的。rand(1,5)#输入值为500万行x=np.random.rand(5000000,5)##使用循环importnumpyasnpm=np.random.rand(1,5)x=np.random.rand(5000000,5)total=0tic=time.process_time()foriinrange(0,5000000):total=0forjinrange(0,5):total=total+x[i][j]*m[0][j]zer[i]=totaltoc=time.process_time()print("计算时间="+str((toc-tic))+"秒")####计算时间=27.02秒##向量化tic=time.process_time()#dotproductnp.dot(x,mT)toc=time.process_time()print("Calculationtime="+str((toc-tic))+"seconds")####计算时间=0.107秒np.dot在后端实现向量化矩阵乘法。与Python中的循环相比,它快165倍。结论python中的向量化非常快,并且在我们处理非常大的数据集时应该优先于循环。随着时间的推移,您开始实施它时,您将习惯于将代码矢量化。
