東京大学のPythonプログラミング入門「5-3. NumPyライブラリ」備忘録

Python勉強中で備忘録です。今回も内容はそこまで多くなかったですが、少し問題で理解に時間がかかりました。

以下の回答を作成したところ、正解となりました。

def arange_square_matrix(n):
a = np.arange(n**2)
x = 0
while x < n**2:
y = x//n
a[x]=x+y-y*n
x += 1
b = a.reshape(n,n)
return b

模範解答は以下の通りでした。「for i in range(n)」をこの位置に使うのはまだ習っていないのでは?

n=3のときは
[
np.arange(0,3),
np.arange(1,4),
np.arange(2,5)
]
*↑[ np.arange(0,3), np.arange(1,4), np.arange(2,5) ]と一緒見え方が違うだけ。

すなわち

[
array([0,1,2]),
array([1,2,3]),
array([2,3,4])
]

こういった1次元配列が連続したリストをnp.arrayで2次元配列でまとめているという理解のよう。これもChatGPTで理解できましたが、テキストだけ見ても分からなそうな。この問題は不親切な気がしました。色々勉強にはなりましたが。

ChatGPTの模範解答は以下の通りでした。行(横ベクトル)+列(縦ベクトル)を足すとこういう計算になるのは知りませんでした。高校で習わなかった気がします。でも解答としては分かりやすいですね。


⇒numpy.dot()と numpy.matmul() の違いが良く分からなかったのでChatGPTに説明してもらいました。

✅ 一番大きな違い

関数主な用途
numpy.dot()「内積」寄りの歴史的関数(やや挙動が多用途)
numpy.matmul()「行列積」専用(@ 演算子と同じ)

🔹 1次元ベクトル同士

a = np.array([1,2,3])
b = np.array([4,5,6])

dot

np.dot(a, b)

→ 32(内積)

matmul

np.matmul(a, b)

→ 32(同じ)

👉 ここは同じ


🔹 2次元配列(普通の行列)

A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])

dot

np.dot(A, B)

matmul

np.matmul(A, B)

👉 どちらも普通の行列積になる


🔹 3次元以上で違いが出る

ここが重要 ⚠️


dot の挙動(ちょっとクセがある)

np.dot(A, B)
  • 最後の軸とその前の軸を使って計算
  • 高次元だと やや直感的でない

matmul の挙動(直感的)

np.matmul(A, B)
  • 最後の2軸を「行列」として扱う
  • 前の軸は「バッチ処理」扱い

つまり:

👉 ディープラーニングや線形代数的には matmul が自然


🔹 1次元 × 2次元 の違い

これも少し違う。

dot

np.dot(a, A)

→ OK

matmul

np.matmul(a, A)

→ ベクトルを行列とみなして計算

概ね同じだが、
matmulは「行列の世界」に寄せて考える。


🔹 @ 演算子

A @ B

これは

np.matmul(A, B)

と同じ。


🔹 まとめ

✔ 基本的な使い分け

  • ベクトル内積 → dot
  • 行列積 → matmul または @

✔ 実務的おすすめ

👉 今から書くなら @(=matmul)を使うのが普通

理由:

  • 挙動が明確
  • 高次元で自然
  • 新しい書き方

🔹 一言でまとめると

dot = 古くて多用途
matmul = 純粋な行列積
@ = いま主流

⇒分かりにくいですが、とりあえず基本的には行列積はmatualを使うのが良いと思いました。


⇒ノルムはベクトルの大きさ(長さ)。

コメント

タイトルとURLをコピーしました