HOWTO · NumPy
NumPy でマトリックスに行を追加
このチュートリアルでは、numpy の行列に行を追加する方法を示します。
このページの内容
NumPy の行列は2次元配列です。行を追加するには、すべての列に対応する値を用意し、その行を axis 0 に沿って結合します。単純に縦方向へ積み重ねるなら numpy.vstack() を使い、配列の結合方法がコードに合う場合は numpy.append() または numpy.concatenate() を使います。これらの操作は新しい配列を返すため、結果を使うには代入してください。
例では3列の行列に [7, 8, 9] を追加します。各例では結果の配列を出力し、追加された行を確認できます。
numpy.vstack() で行を追加する
numpy.vstack() は配列を縦方向に積み重ねます。追加する行は1次元配列として渡せます。この関数は新しい配列を返し、追加した行を末尾に配置します。
次の例を実行します。
import numpy as np
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
new_row = np.array([7, 8, 9])
result = np.vstack((matrix, new_row))
print(result)
元の matrix は変更されず、result に追加後の行列が格納されます。行列の列数に合わせるため、追加する行には3つの値が必要です。複数行を追加する場合は、各行をまとめた2次元配列を numpy.vstack() に渡します。
numpy.append() で行を追加する
numpy.append() で行方向に追加するには、axis=0 を指定します。この例では、追加する行の形状は (1, 3) の2次元配列です。行列と次元数が一致し、列数も3列でそろっています。
import numpy as np
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
new_row = np.array([[7, 8, 9]])
result = np.append(matrix, new_row, axis=0)
print(result)
numpy.append() は新しい配列を返し、matrix をその場で変更しません。追加後の配列を使うには、上の例のように戻り値を代入します。axis=0 を指定した場合、配列同士の列数をそろえる必要があります。互換性のある形状の2次元配列を渡せば、複数行も追加できます。大きな配列に何度も行を追加する場合は、追加する行をいったん集めてから一度に結合する方法を検討してください。追加のたびに結果の配列が作られるためです。
numpy.concatenate() と numpy.r_ で行を結合する
numpy.concatenate() は既存の axis に沿って配列を結合します。行を追加するには axis=0 を指定し、各入力配列の列数をそろえてください。これは汎用的な配列結合の操作なので、互換性のある配列を2つより多く結合する場合にも使えます。
import numpy as np
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
new_row = np.array([[7, 8, 9]])
result = np.concatenate((matrix, new_row), axis=0)
print(result)
numpy.r_ は関数呼び出しではなく、特殊なインデックス指定用オブジェクトです。この例のような行方向の結合を簡潔に記述できます。
import numpy as np
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
new_row = np.array([[7, 8, 9]])
result = np.r_[matrix, new_row]
print(result)
縦方向に積み重ねる意図を明確にしたい場合は numpy.vstack() を選びます。axis を明示したい場合や、配列の並びを結合したい場合は numpy.concatenate() が適しています。単純な結合には、簡潔に書ける numpy.r_ も使えます。
numpy.insert() で指定した位置に行を挿入する
新しい行を既存の行の間に入れる場合は numpy.insert() を使います。obj 引数で挿入位置を指定します。たとえばインデックス 1 を指定すると、現在の2行目の前に行が入ります。行方向に挿入するには axis=0 を指定します。
import numpy as np
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
new_row = [7, 8, 9]
result = np.insert(matrix, 1, new_row, axis=0)
print(result)
最後の行の後ろに挿入するには、現在の行数を位置として指定します。2次元配列では .shape は属性で、その最初の値が行数を表します。
import numpy as np
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
new_row = [7, 8, 9]
position = matrix.shape[0]
result = np.insert(matrix, position, new_row, axis=0)
print(result)
ほかの方法と同様に、numpy.insert() は新しい配列を返します。結果を保持するか、matrix に代入してください。元の配列は変更されません。4つの方法すべてで、追加する行の列数を既存の行と一致させる必要があります。