アプリケーションが信頼できるかどうかを判断するには、アルゴリズムの時間計算量が非常に重要です。リアルタイム出力を適用する場合、大規模なアルゴリズムを可能な限り迅速に実行することが非常に重要です。これを行うために、Pythonには、ループを記述せずにデータの配列全体に対して操作をすばやく実行するためのいくつかの標準的な数学関数があります。そのような関数を含むそのようなライブラリの1つは、 numpy em>です。ベクトル化の場合にこの標準関数をどのように使用できるか見てみましょう。
ベクトル化とは何ですか? b>
ベクトル化は、ループを使用せずにPythonコードを高速化するために使用されます。このような関数を使用すると、コードの実行時間を最小限に抑えることができます。さまざまな操作がベクトルに対して実行されます。たとえば、ドット積 em>は単一の出力を生成するため、結果として外部積が生成されるため、ドット積とも呼ばれます。正方形の測定行列で。ベクトルの長さの長さXに等しく、要素による乗算 em>は、積を生成します。インデックスの要素と行列の次元は変更されません。
従来の方法が通常の関数よりもどのように時間がかかるかを確認し、処理時間を計算します。
外部(a、b):2つのベクトルの外積を計算します。
blockquote>
乗算(a、b):2つの配列の行列積。
ドット(a、b):2つの配列の内積。
ゼロ((n、m)):指定された形状とタイプの行列を返し、ゼロで埋めます。
process_time ():現在のプロセスのシステム時間とユーザーCPU時間の合計の値(秒単位)を返します。睡眠中の経過時間は含まれません。内積: b>
内積—これは、同じ長さの2つのベクトルを乗算して、1つの数値を生成する代数演算です。ドット積は、多くの場合、内積と呼ばれます。この積はスカラー数になります。同じ長さの2つの行列aとb em>を考えてみましょう。ドット積は、最初の行列を転置することによって実行され、次に乗算が実行されます。下の画像に示すように、 a' em>(転置a)と bによる数学行列の変換。視覚的表現ドット積の— b>
figure>
以下はPythonコードです:
#ドット製品
import
時間
import
numpy
import
配列
#8バイトint
a
=
array.array(
`q`
)
for
i
in
range
(
100000
):
a.append(i);
b
=
配列。配列(
`q`
)
for
i
in
range
(
100000
、
200000
):
b.append(i)
#クラシックドット製品実装ベクトル
tic
=
時間。
process_time ()
dot
=
0.0
;
for
i
in
range
(
len
(a)):
dot
+
=
a [i]
*
b [i]
toc
=
time。
process_time ()
(
"dot_product ="
+
str
(ドット));
(
"計算時間="
+
str
(
1000
*
(toc
-
tic))
+
"ms"
)
n_tic
=
時間。
process_time ()
n_dot_product
=
numpy.dot(a、b)
n_toc
=
時間。
process_time ()
(
"n_dot_product ="
+
str
(n_dot_product))
(
"計算時間="
+
str
(
1000
*
(n_toc
-
n_tic))
+
" ms "
)
終了:
dot_product=833323333350000.0計算時間=35.59449199999999msn_dot_p roduct=833323333350000計算時間=0.1559900000000225ms屋外積: b>
2つの座標ベクトルのテンソル積はと呼ばれます。外部作業。次元がnx1
とmx1
の2つのベクトルaとb em>を考えると、ベクトルの外積は次のようになります。長方形の行列nxm
。2つのベクトルの次元が同じである場合、結果の行列は、図に示すように正方行列になります。外部積の視覚的表現— b>
figure>
Pythonコードは次のとおりです。
#屋外製品
インポート
時間
import
numpy
import
配列
a
=
array.array(
`i`
)
< / p>
for
i
in
範囲
(
200
):
a.append (私);
b
=
配列。配列(
`i`
)
for
i
in
range
(
200
、
400
):
b.append(i)
#従来の外部製品ベクトルの実装
tic
=
時間。
process_time ()
external_product
=
numpy.zeros((
200
、
200
))
for
i
in
range
(
len
( a)):
for
j
in
range
(
len
(b)):
external_product [i] [j]
=
a [i]
*
b [j]
toc
=
time。
process_time ()
印刷
(
"outer_product ="
+
str
(outer_product));
(
"計算時間="
+
str
(
1000
*
(toc
-
tic))
+
"ms"
)
n_tic
=
time。 process_time ()
external_product
=
numpy.outer(a、b)
n_toc
=
時間。
process_time ()
< / p>
(
"outer_product ="
+
str
(outer_product));
(
"計算時間="
+
str
(
1000
*
(n_toc
-
n_tic))
+
"ms"
)コード>
終了:
external_product=[[0。 0. 0. ...、0。0.0.][200.201.202。 ...、397。398.399.][400。 402. 404. ...、794. 796. 798.] ...、[39400。 39597。39794。...、78209。78406。78603。][39600。 39798. 39996. ...、78606. 78804.79002.][39800。 39999. 40198. ...、79202.79401.]]計算時間=39.821617msouter_product = [[0 0 0 ...、0 0 0] [200 201 202 ...、397 398 399] [400 402 404 ...、794 79 6 798] ...、[39400 39597 39794 ...、78209 78406 78603] [39600 39798 39996 ...、78606 78804 79002] [39800 39999 40198 ...、79003 79202 79401]]計算時間=0.2809480000000031ms要素ごとの積: b>
2つの行列の要素ごとの乗算&#8212;これは代数演算であり、最初の行列の各要素に、後の行列の対応する要素が乗算されます。行列の次元は同じである必要があります。
2つの行列aとb em>、 a em>の要素インデックスを検討してください&#8212;これらはiとj em>であり、 a(i、j)にb(i、j)を掛けます。 、それぞれ、下の図に示すように。賢明な製品要素の視覚的表現&#8212; b>
figure>
以下はPythonコードです:
#要素ごとの乗算
import
時間
import
numpy
import
配列
< / p>
a
=
array.array(
`i`
)
for
i
in
範囲
(
50000
):
a.append(i);
b
=
配列。配列(
`i`
)
for
i
in
range
(
50000
、
100000
):
b.append(i)
#従来のアイテムごとの製品ベクトルの実装
ベクトル
=
numpy.zeros((
50000
))
tic
=
time。
process_time ()
for
i
in
range
(
len
(a)):
vector [i]
=
a [i]
*
b [i]
toc
=
時間。
process_time ()
(
"要素ごとの製品= "
+
str
(vector ));
(
"計算時間="
+
str
(
1000
*
(toc
-
tic))
+
"ms"
)
n_tic
=
時間。
process_time ()
ベクトル
<コードクラス="キーワード">=<コードクラス="プレーン">numpy.multiply(a、b)<コードクラス= "plain"> n_toc
=
時間。
process_time ()
印刷
(
"Element wise Product ="
+
str
(vector));
td> tr> tbody> table>
(
"計算時間="
+
str
(
1000
*
(n_toc
-
n_tic))
+
"ms"
)コード>
終了:
要素ごとの製品=[0.00000000e+ 00 5.00010000e + 04 1.00004000e + 05 ...、4.99955001e + 09 4.99970000e + 09 4.99985000e+09]計算時間=23.516678000000013ms要素ごとの製品=[050001100004。 ..、704582713704732708704882705]計算時間=0.2250640000000248msShop
Latest questions
Wiki