ホームページ  >  記事  >  バックエンド開発  >  ベクトル化を使用して Python のループを置き換える

ベクトル化を使用して Python のループを置き換える

王林
王林転載
2023-04-14 19:07:041137ブラウズ

すべてのプログラミング言語はループから切り離せません。したがって、デフォルトでは、繰り返し操作があるたびにループの実行を開始します。しかし、多数の反復 (数百万行/数十億行) を扱う場合、ループの使用は犯罪です。数時間動けなくなって、後でそれがうまくいかないことに気づくかもしれません。ここで、Python でのベクトル化の実装が非常に重要になります。

ベクトル化を使用して Python のループを置き換える


#ベクトル化とは何ですか?

ベクトル化は、データ セットに対する (NumPy) 配列操作を実装するための手法です。バックグラウンドで、配列または系列のすべての要素に操作を一度に適用します (一度に 1 行を操作する「for」ループとは異なります)。

次に、いくつかのユースケースを使用して、ベクトル化とは何かを説明します。

数値の合計を求める
##使用循环
import time 
start = time.time()

 
# iterative sum
total = 0
# iterating through 1.5 Million numbers
for item in range(0, 1500000):
total = total + item


print('sum is:' + str(total))
end = time.time()

print(end - start)

#1124999250000
#0.14 Seconds
## 使用矢量化
import numpy as np

start = time.time()

# vectorized sum - using numpy for vectorization
# np.arange create the sequence of numbers from 0 to 1499999
print(np.sum(np.arange(1500000)))

end = time.time()

print(end - start)


##1124999250000
##0.008 Seconds

レンジ関数を使用した反復と比較して、ベクトル化の実行時間は約 18 倍短縮されます。この違いは、Pandas DataFrame を使用する場合にさらに顕著になります。

数学演算

データ サイエンスでは、Pandas DataFrame を使用する場合、開発者はループを使用して数学演算を通じて新しい派生列を作成します。

以下の例では、このようなユースケースでループをベクトル化に置き換えるのがいかに簡単であるかがわかります。

DataFrame は、行と列の形式の表形式のデータです。

500 万行と 0 から 50 までのランダムな値が入った 4 列を持つ pandas DataFrame を作成します。

ベクトル化を使用して Python のループを置き換える

import numpy as np 
import pandas as pd 
df = pd.DataFrame(np.random.randint( 0 , 50 , size=( 5000000 , 4 )), columns=( 'a' , 'b' , 'c' , 'd ' )) 
df.shape 
# (5000000, 5)
 df.head()

新しい列「ratio」を作成して、列「d」と「c」の比率を調べます。

## 循环遍历
import time 
start = time.time() 

# 使用 iterrows 遍历 DataFrame 
for idx, row in df.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.12 秒

DataFrame では大幅な改善が見られ、ベクトル化された操作は Python のループと比べてほぼ 1000 倍速くなりました。

If-else ステートメント

「If-else」タイプのロジックを使用する必要がある多くの操作を実装しました。このロジックは、Python のベクトル化された操作に簡単に置き換えることができます。

よりよく理解するために、次の例を見てみましょう (ユースケース 2 で作成した DataFrame を使用します):

既存の列「a」に基づいてデータを作成したいと想像してください。 "

## 使用循环
import time 
start = time.time() 

# 使用 iterrows 遍历 DataFrame 
for idx, row in df.iterrows(): 
if row.a == 0 : 
df.at[idx, 'e' ] = row.d 
elif ( row.a <= 25 ) & (row.a > 0 ): 
df.at[idx, 'e' ] = (row.b)-(row.c) 
else : 
df.at[idx, 'e' ] = row.b + row.c 

end = time.time() 

print (end - start) 
### 耗时:166 秒
## 矢量化
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()
打印(结束 - 开始)
## 0.29007707595825195 秒

に何らかの条件を付けて新しい列 "e" を作成します。ベクトル化された操作は、if-else ステートメントを使用した Python ループと比較して 600 倍高速です。

機械学習/ディープ ラーニング ネットワークを解く

ディープ ラーニングでは、複数の複雑な方程式を解く必要があり、解決すべき方程式は何百万も存在します。 10 億行問題を解決します。 Python でこれらの方程式を解くためにループを実行すると非常に時間がかかるため、ベクトル化が最適な解決策です。

たとえば、次の重線形回帰式で数百万行の y 値を計算します。


ループの代わりにベクトル化できます。

ベクトル化を使用して Python のループを置き換える

m1、m2、m3... の値は、x1、x2、x3 に対応する数百万の値を使用して上記の方程式を解くことによって決定されます。 .

ベクトル化を使用して Python のループを置き換える

ベクトル化を使用して Python のループを置き換える

import numpy as np 
# 设置 m 的初始值
m = np.random.rand( 1 , 5 ) 

# 500 万行的输入值
x = np.random.rand( 5000000 , 5 )
## 使用循环
import numpy as np
m = np.random.rand(1,5)
x = np.random.rand(5000000,5)

total = 0
tic = time.process_time()

for i in range(0,5000000):
total = 0
for j in range(0,5):
total = total + x[i][j]*m[0][j] 

zer[i] = total 

toc = time.process_time()
print ("Computation time = "+ str ((toc - tic)) + "seconds" ) 

####计算时间 = 27.02 秒
## 矢量化
tic = time.process_time() 

#dot product
np.dot(x,mT) 

toc = time.process_time() 
print ( "计算时间 = " + str ((toc - tic)) + "seconds" ) 

####计算时间 = 0.107 秒

np.dot バックエンドでベクトル化された行列の乗算を実装します。 Python のループと比較して 165 倍高速です。

結論

Python でのベクトル化は非常に高速であり、非常に大規模なデータセットを扱う場合にはループよりも優先されるべきです。

ベクトル化を使用して Python のループを置き換える

# 時間をかけて実装し始めると、コードのベクトル化の観点から考えることに慣れてきます。

以上がベクトル化を使用して Python のループを置き換えるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。