我们已经了解了几乎所有编程语言中的循环。因此,默认情况下,只要有重复操作,我们就会开始执行循环。但是当我们处理大量的迭代(数百万/十亿行)时,使用循环真的很痛苦,你可能会卡住几个小时才意识到它不起作用。这就是在Python中实现矢量化变得非常关键的地方。什么是矢量化?矢量化是一种用于在数据集上实现(NumPy)数组操作的技术。在幕后,它一次对数组或系列的所有元素进行操作(与一次操作一行的“for”循环不同)。在此博客中,我们将研究一些用例,在这些用例中我们可以轻松地用矢量化替换Python循环。这将帮助您节省时间并更加精通编码。用例1:求数字之和首先,让我们看一个在Python中使用循环和向量求数字和的基本示例。使用循环importtimestart=time.time()#遍历sumtotal=0#遍历150万个数foriteminrange(0,1500000):total=total+itemprint('sumis:'+str(total))end=time.time()print(end-start)#1124999250000#0.14秒使用向量化importnumpyasnpstart=time.time()#vectorizationand--usenumpyforvectorization#np.rangecreatedfrom0Sequenceofnumbersto1499999print(np.sum(np.arange(1500000)))end=time.time()print(end-start)##1124999250000##0.008秒相比迭代使用范围函数,vectorized执行时间大约是18倍.使用PandasDataFrames时,这种差异会变得更加明显。用例2:DataFrames的数学运算在数据科学中,当使用PandasDataFrames时,开发人员使用循环为新的数学运算创建派生列。在下面的示例中,我们可以看到在此类用例中可以很容易地用矢量化替换循环。创建DataFrameDataFrame是行和列形式的表格数据。我们正在创建一个具有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”列的比率。Useloopimporttimestart=time.time()#使用iterrowsforidx,rowindf.iterrows():#creatinganewcolumndf.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.12秒我们可以看到DataFrame有了明显的改进,与python中的循环相比,vector快了近1000倍。用例3:DataFrame上的If-else语句我们已经实现了许多需要我们使用“if-else”类型逻辑的操作。我们可以轻松地将这些逻辑替换为python中的矢量化操作。查看下面的示例以更好地理解它(我们将使用在用例2中创建的DataFrame)。想象一下如何根据退出列“a”的某些条件创建新列“e”。Useloopimporttimestart=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)###所用时间:177秒使用矢量化start=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.28007707595825195sec与使用if-else语句的python循环相比,矢量化操作比循环快600倍.用例4:求解机器学习/深度学习网络深度学习要求我们求解多个复杂方程,以及数百万和数十亿行。在Python中运行循环来求解这些方程式非常慢,此时矢量化是最佳解决方案。例如,计算以下多元线性回归方程中数百万行的y值。我们可以用矢量化代替循环。m1,m2,m3...的值是通过使用x1,x2,x3...对应的数百万个值求解上述方程来确定的(为简单起见,只看一个简单的乘法步骤)创建Data>>>importnumpyasnp>>>#设置m的初始值>>>m=np.random.rand(1,5)array([[0.49976103,0.33991827,0.60596021,0.78518515,0.5540753]])>>>#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))+"秒")####计算时间=28.228秒使用矢量化tic=time.process_time()#dotproductnp.dot(x,m.T)toc=time.process_time()print("Computationtime="+str((toc-tic))+"seconds")####计算时间=0.107秒np.dot实现矩阵乘法后端向量的阳离子。它比Python中的循环快165倍。写在最后,Python中的矢量化非常快,在处理非常大的数据集时,建议您应该优先考虑矢量化而不是循环。这样,久而久之,你就会慢慢习惯沿着向量化的思路写代码。
