zukucode
主にWEB関連の情報を技術メモとして発信しています。

NumPy 行列の各行の先頭に要素を追加する

NumPyで行列の各行の先頭に要素を追加する方法を紹介します。

例えば機械学習で、データセットのすべての訓練インスタンスにバイアスを設定するときなどに使用します。

例えば以下のNumPy配列があるとします。3つの特徴量を持つ訓練データが4つあるイメージです。

import numpy as np
data = np.array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9],
       [10, 11, 12]])

print(data)
# [[ 1  2  3]
# [ 4  5  6]
# [ 7  8  9]
# [10 11 12]]

4つの訓練データの要素の先頭にバイアスの要素を追加します。

バイアスの値はすべて1で追加しています。

m, n = data.shape
data_plus_bias = np.c_[np.ones(m, 1), data]

print(data_plus_bias)
# [[ 1.  1.  2.  3.]
#  [ 1.  4.  5.  6.]
#  [ 1.  7.  8.  9.]
#  [ 1. 10. 11. 12.]]

解説

m, n = data.shapedata配列の行数、列数を取得します。

mには行数、nには列数がセットされます。

np.ones(shape)ですべての要素が1の配列を作成します。

a = np.ones((2, 3))

print(a)
# [[1. 1. 1.]
#  [1. 1. 1.]]
m, n = data.shape
a = np.ones((m, 1))

print(a)
# [[1.]
# [1.]
# [1.]
# [1.]]

np.c_[配列A, 配列B]とすると、配列Aと配列Bを結合します。

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

c = np.c_[a, b]
print(c)
# [[1 2 5 6]
#  [3 4 7 8]]

np.ones(m, 1)で作成した配列とdataを結合すれば以下のようになります。

m, n = data.shape
data_plus_bias = np.c_[np.ones(m, 1), data]

print(data_plus_bias)
# [[ 1.  1.  2.  3.]
#  [ 1.  4.  5.  6.]
#  [ 1.  7.  8.  9.]
#  [ 1. 10. 11. 12.]]

関連記事