「NumPyのドット積のデコード:次元の魔術についての簡単な探求」
Decoding NumPy's dot product An exploration of dimension magic
NumPyのドット積についての混乱を一度解消する
はじめに
NumPyで次元に関する取り扱いについて混乱することは私だけではないのでしょうか?今日、Gradioのドキュメンテーションページを読んでいたら、以下のコードスニペットがありました:
sepia_filter = np.array([ [0.393, 0.769, 0.189], [0.349, 0.686, 0.168], [0.272, 0.534, 0.131],])# input_imgの形状は (H, W, 3)# sepia_filterの形状は (3, 3)sepia_img = input_img.dot(sepia_filter.T) # <- なぜこれが有効なのか??sepia_img /= sepia_img.max()
おいおいおい!なぜ画像(W, H, 3)とフィルター(3, 3)のドット積が有効なのですか?ChatGPTに説明してもらおうとしたら、間違った答え(これは動作しないと言っているなど)を出したり、私の質問を無視して他のことに答え始めたりしました。仕方がないので、頭を使うしかありませんでした(ドキュメンテーションを読むこともね)。
上記のコードに少し混乱している方は、読み続けてください。
ドット積:一般的な例
NumPyのドット積のドキュメンテーションから(若干の修正を加えて):
もし、a.shape = (I, J, C) かつ b.shape = (K, C, L) の場合、dot(a, b)[i, j, k, l] = sum(a[i, j, :] * b[k, :, l]) です。注意すべきは、「a」の最後の次元は「b」の最後から2番目の次元と等しいということです。
または、コードで表すと:
I, J, K, L, C = 10, 20, 30, 40, 50a = np.random.random((I, J, C))b = np.random.random((K, C, L))c = a.dot(b)i, j, k, l = 3, 2, 4, 5print(c[i, j, k, l])print(sum(a[i, j, :] * b[k, :, l]))
出力結果(同じ結果):
13.12501290128471313.125012901284713
NumPyのドット積の形状を理解する
事前にドット積の形状を決定するために、以下の手順に従ってください:
ステップ1:2つの配列「a」と「b」を考えます。それぞれの形状を確認します。
# 配列aとbの例の形状a_shape = (4, 3, 2)b_shape = (3, 2, 5)# 指定された形状でランダムな配列を作成a = np.random.random(a_shape)b =…
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles