💻

機械学習の実装:教科書は縦ベクトルなのに、なぜPythonでは横ベクトルが一般的なの?

に公開

🔹 教科書では「縦ベクトル」が一般的な理由

  1. 線形代数の標準的な表記に従っているから
    数学の教科書では、

    \mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}

    のように**縦ベクトル(列ベクトル)**で表現するのが一般的です。

  2. 行列積と一致する形だから
    重み行列 W を使った入力との線形結合も、

    Wx + b

    と自然な形で書けるためです。
    (このとき、W は出力次元×入力次元の行列)


🔹 Python(特にNumPyやPyTorch)で「横ベクトル」が多い理由

  1. 1次元配列は「横ベクトル」のように扱われる

    • NumPyやPyTorchでは、np.array([1, 2, 3])1次元配列(shape: (3,))ですが、これは見た目上横ベクトル的に動作します。
    • 一方、縦ベクトルとして扱うにはnp.array([[1], [2], [3]])(shape: (3,1))が必要で、記述がやや面倒。
  2. バッチ処理で行ベクトルが都合がよい
    多くのディープラーニングライブラリでは、複数データ(バッチ)の入力をまとめて扱うため、以下のような行列を使います:

    [[x11, x12, x13],   ← 1つ目のデータ(行ベクトル)
     [x21, x22, x23],   ← 2つ目のデータ
     ...
    ]
    

    → つまり、**1データ = 1行(横ベクトル)**で表現される

  3. 行優先の言語文化(CやPython)
    PythonやC系の言語では、行優先(row-major)の配列処理が基本なので、処理的にも行ベクトルの方が効率的なことが多いです。


🔸実際どうすればよい?

  • 数学的に考えるときは「縦ベクトル」を前提に。
  • 実装で困ったら、shape を確認して x.T(転置)や x.reshape(-1, 1) を使えば、縦ベクトル的に扱えます。
  • PyTorchなどでは、nn.Linear は横ベクトル(行入力)を想定しているため、特に意識が必要です。

🔽 まとめ

項目 教科書(数学) Python実装(NumPy/PyTorch)
ベクトルの形 縦ベクトル(列) 横ベクトル(行)または1次元
行列積 Wx xW^T またはブロードキャスト対応
バッチ 各列 各行が1データ

Discussion