AI資格ドリル
資格を選ぶ

用語比較

np.dotとnp.matmul(@)の違い|スカラーの扱いと3次元以上の配列の結果(Python3データ分析)

2次元配列どうしなら np.dot も np.matmul も同じ行列積を返し、違いが出るのは、スカラーを渡したときと、3次元以上の配列を渡したときです。

np.dot はスカラーとの積なら乗算と同じなので、スカラーとの積は *、行列積は @と使い分けます。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。

np.dotとnp.matmul(@)の要点

np.dot

1次元どうしなら内積、2次元どうしなら行列積。どちらかがスカラーなら乗算と同じ。3次元以上では、公式の例で (9,5,7,4) と (9,5,4,3) の配列から (9,5,7,9,5,3) の形が返る。

np.matmul(@)

行列積を求める。スカラーを渡すと ValueError になる。3次元以上は行列の積み重ねとして扱い、公式の同じ例で (9,5,7,3) の形が返る。@ 演算子は matmul の短縮形。

違いを表で確認

比較軸np.dotnp.matmul(@)
スカラーを渡したとき乗算と同じ結果になる。公式の例では np.dot(3, 4) が 12ValueError になる。公式は、スカラーとの積には * を使うよう示している
3次元以上の配列公式の例では (9,5,7,4) と (9,5,4,3) から (9,5,7,9,5,3) の形が返る最後の2つの軸を行列とみなし、残りの軸をそろえて計算する。同じ例で (9,5,7,3) の形が返る
2次元配列の行列積での推奨行列積は返すが、公式は matmul か a @ b を勧めている公式が勧める書き方。@ 演算子は matmul と同じ意味で、ndarray で使える
複素数の内積どちらの引数も複素共役にしない。np.dot([2j, 3j], [2j, 3j]) は (-13+0j)こちらも複素共役にしない。np.matmul([2j, 3j], [2j, 3j]) も (-13+0j)

Python3エンジニア認定データ分析試験の学習に使う書籍(Amazon)

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

2次元の行列どうしを掛けたい人

a @ b と書きます。公式は、2次元配列の行列積には matmul か a @ b を勧めています。np.dot でも同じ結果になりますが、勧められているのは @ のほうです。

02

配列にスカラーを掛けたい人

a * 3 のように * を使います。np.matmul([1, 2], 3) は ValueError になり、np.dot なら乗算と同じ結果になりますが、公式は multiply か * を勧めています。

03

行列を積み重ねた3次元の配列で、行列ごとに積を求めたい人

np.matmul を使います。公式の例では、(2,2,4) と (2,4,2) の配列を matmul に渡すと (2,2,2) の形になり、行列ごとの積が返ります。

具体例で使い分ける

例 1

3次元以上で結果の形が変わる

公式の例の a = np.ones([9, 5, 7, 4]) と c = np.ones([9, 5, 4, 3]) を掛けます。

  • np.dot(a, c).shape は (9, 5, 7, 9, 5, 3) です。
  • np.matmul(a, c).shape は (9, 5, 7, 3) です。
  • matmul は、行列の積み重ねどうしを軸ごとにそろえて掛けるためです(n が7、k が4、m が3)。

結論: 3次元以上では、dot と matmul は同じ結果になりません。

例 2

スカラーを渡す

公式の例で、スカラーとの積を求めます。

  • np.dot(3, 4) は 12 を返します。
  • np.matmul([1, 2], 3) は、スカラーの値を渡したため ValueError になります。

結論: スカラーとの積は、公式が勧める * を使います。

例 3

2次元配列の行列積

公式の例の a = [[1, 0], [0, 1]] と b = [[4, 1], [2, 2]] を掛けます。

  • np.dot(a, b) も np.matmul(a, b) も、array([[4, 1], [2, 2]]) を返します。
  • a は単位行列なので、b がそのまま返ります。

結論: 2次元どうしなら結果は同じです。書き方は @ を選びます。

問題文から答えを選ぶ手順

  1. 1

    配列の次元を見る

    2次元どうしなら dot でも matmul でも同じ結果です。3次元以上が混ざるときは、結果の形が変わります。

  2. 2

    スカラーとの積かを見る

    スカラーとの積は、公式が勧める * を使います。matmul にスカラーを渡すと ValueError です。

  3. 3

    公式が勧める書き方を選ぶ

    行列積は a @ b か matmul、スカラーとの積は * か multiply と書くと、読む人に意図が伝わります。

試験での見分け方

  • 12次元配列の行列積には、公式が勧める matmul か a @ b を使う。
  • 2スカラーとの積には、乗算と同じになる dot ではなく、* か multiply を使う。
  • 3matmul にスカラーを渡すと ValueError になる。
  • 43次元以上の配列では、dot と matmul で結果の形が変わる。

誤答しやすい選択肢

np.matmul で配列にスカラーを掛けられると考える

修正: matmul はスカラーを受け付けず、ValueError になります。スカラーとの積には * を使います。

3次元以上でも dot と matmul は同じ結果だと考える

修正: 公式の例では、同じ入力で dot は (9,5,7,9,5,3)、matmul は (9,5,7,3) の形を返します。

* が行列積を求める演算子だと考える

修正: 行列積は @ か matmul です。* は要素ごとの乗算で、スカラーとの積に使います。

確認問題

Q1公式が、2次元配列の行列積に勧めている書き方は?

答え: matmul か a @ b

np.dot でも行列積は求まりますが、公式は matmul か @ を勧めています。

Q2np.matmul([1, 2], 3) を実行するとどうなるか?

答え: ValueError になる

matmul はスカラーを受け付けません。スカラーとの積には * を使います。

Q3(9,5,7,4) と (9,5,4,3) の配列を np.matmul で掛けると、結果の形は?

答え: (9, 5, 7, 3)

最後の2軸を行列として掛け、残りの軸をそろえます。np.dot なら (9,5,7,9,5,3) です。

Q4np.dot([2j, 3j], [2j, 3j]) は複素共役を取るか?

答え: 取らない

公式の例は (-13+0j) で、どちらの引数も複素共役にしません。

到達チェック

  • dot と matmul の違いを、スカラーの扱いで説明できる
  • 3次元以上で結果の形が変わることを言える
  • 行列積に公式が勧める書き方を答えられる
  • @ 演算子が matmul の短縮形だと分かる

同じ資格で次に知りたいこと

よくある質問

Qnp.dotとnp.matmulの違いは?

A

スカラーを渡したとき、dot は乗算と同じ結果を返し、matmul は ValueError になります。3次元以上の配列では、結果の形も変わります。

Q@ 演算子は何ですか?

A

ndarray で使える、matmul の短縮形です。2次元配列の行列積には、公式が matmul か a @ b を勧めています。

Qスカラーを掛けるときはどう書きますか?

A

公式は multiply か * を勧めています。np.dot でも同じ結果になりますが、matmul では ValueError になります。

Qデータ分析試験の範囲?

A

本サイトの第2章数学の基礎の「線形代数」で扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。

次に見る比較

執筆: AI資格ドリル編集部(運営者情報を見る)