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.shape
でdata
配列の行数、列数を取得します。
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.]]