Pythonの行列計算で迷わない!np.dotとアスタリスクの違いを完全解説

こんにちは。ゆうせいです。

プログラミングを学び始めたばかりの時期、特にPythonでデータ分析や機械学習に触れようとすると、必ずと言っていいほど直面する壁があります。

それは、掛け算の方法が複数あること、ではないでしょうか?

「学校で習った掛け算は一つだけだったのに、なんでPythonには何種類もあるの?」と頭を抱えてしまった経験、ありませんか?実は私も新人の頃、この計算の違いでエラーを連発し、モニターの前でフリーズしたことがあります。

今日は、そんな過去の私のような皆さんのために、Pythonの数値計算ライブラリであるNumPyを使った、np.dotと記号のアスタリスクの違いについて、とことん優しく解説していきます。

これを読み終わる頃には、あなたはもう掛け算の種類で迷うことはなくなっているはずです。さあ、一緒に計算の不思議な世界を覗いてみましょう!

二つの「掛け算」の正体

まず最初に、結論からお伝えしますね。この二つは、計算のルールそのものが全く別物なのです。

料理に例えるなら、アスタリスクは「具材を個別に混ぜる」作業で、np.dotは「料理を完成させてカロリー計算まで済ませる」ような複雑な処理を行っています。

専門用語を使うと、次のようになります。

  • アスタリスク:要素ごとの積(アダマール積)
  • np.dot:行列積(内積など)

ちょっと難しそうな言葉が出てきましたね。でも大丈夫です!ここから高校生でもわかるように、噛み砕いて見ていきましょう。

アスタリスクは「ペア同士の掛け算」

まずは、記号のアスタリスクを使う計算からです。これは、皆さんが直感的にイメージする掛け算に一番近いものです。

専門用語では「要素ごとの積」や「アダマール積」と呼ばれます。

想像してみてください。あなたはスーパーで買い物をしています。

  • りんごを 2 \times 3 個
  • みかんを 4 \times 5 個

それぞれの果物の合計数を計算したいとき、りんごはりんごと、みかんはみかんと掛け合わせますよね?りんごとみかんを掛けたりはしません。

この「同じ場所にあるもの同士を掛ける」のが、アスタリスクの役割です。

実際のコードを見てみましょう。

Python

import numpy as np

# りんごとみかんの入ったカゴA
box_a = np.array([2, 4])

# りんごとみかんの入ったカゴB
box_b = np.array([3, 5])

# アスタリスクで計算
result = box_a * box_b

print(result)

この計算結果は、次のようになります。

2 \times 3 = 6

4 \times 5 = 20

つまり、結果は [6, 20] という新しい配列になります。

メリットとデメリット

この計算方法の良いところは、直感的でわかりやすいことです。データの加工や、画像処理で色を調整するときなどによく使われます。

一方で、配列の形(要素数)が完全に一致していないとエラーになってしまうという点には注意が必要です。たとえば、りんごとみかんが入った箱と、バナナだけが入った箱を計算しようとすると、Pythonは「相手がいないよ!」と怒ってしまいます。

np.dotは「総当たりの合算」

さて、ここからが少し複雑な np.dot の登場です。

これは「行列積」や「内積」と呼ばれる計算を行います。学校の数学Bで行列やベクトルを習った方は、懐かしいかもしれません。

アスタリスクが「個別の掛け算」だったのに対し、np.dotは「掛けて、最後に全部足す」という性格を持っています。

今度は、お買い物の合計金額を計算する場面を想像してください。

  • 商品の単価:りんご100円、みかん50円
  • 買う個数:りんご3個、みかん4個

合計金額を出すにはどうしますか?

(100円 \times 3個) + (50円 \times 4個) = 500円

このように、「それぞれのペアを掛け算したあと、最後にその結果を合計する」のが、もっとも基本的な np.dot の動き(内積)です。

コードで確認してみましょう。

Python

import numpy as np

# 単価(りんご、みかん)
price = np.array([100, 50])

# 個数(りんご、みかん)
count = np.array([3, 4])

# np.dotで計算
total = np.dot(price, count)

print(total)

この結果は、配列ではなく 500 という一つの数字になります。アスタリスクの時とは結果の形が全く違いますよね?

行列になるともっとパワフルに

もしデータが一次元の配列(ベクトル)ではなく、二次元の表(行列)だった場合、np.dotはさらに強力な「行と列の掛け合わせ」を行います。

これは、A組、B組、C組それぞれの生徒のテストの点数に、特定の重み付けをして評価点を出すような処理で大活躍します。

機械学習やAI(人工知能)の中身は、実はこの np.dot の計算の塊だと言っても過言ではありません。たくさんのデータを一気にまとめて計算処理するのに、この機能は欠かせないのです。

使い分けのポイント

ここまで読んできて、少し頭が整理されてきたでしょうか?

最後に、明日から現場で使える判断基準をまとめておきますね。

  1. データの加工や、単純に値を倍にしたいとき配列の形を変えずに、それぞれの値だけを変化させたいなら、アスタリスクを使いましょう。
  2. 合計値を求めたり、AIのモデルを作るとき複数のデータを掛け合わせて一つの値に集約したり、行列計算が必要なときは np.dot を選びましょう。

まとめ

いかがでしたか?

アスタリスクは「ペアごとの素直な掛け算」、np.dotは「掛けて足し合わせる統合的な計算」という違いがありました。

最初はエラー画面を見て「またサイズが合わないって言われた...」と落ち込むこともあるでしょう。でも、それはあなたが高度な計算処理に挑戦している証拠です!

エラーメッセージは、Pythonからの「計算のルールをもう一度確認してみて!」というアドバイスだと思って、焦らず配列の形(シェイプ)を確認してみてください。

次のステップとして、NumPyの「ブロードキャスト」という機能について調べてみることをお勧めします。これを知ると、配列のサイズが違っても計算できる魔法のようなテクニックが身につきますよ。

一緒に、一歩ずつプログラミングの世界を楽しみながら進んでいきましょう!

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。