記事内にはプロモーションが含まれています

Pythonで2次元配列に行・列を追加する全手法

Pythonで2次元配列に行・列を追加する全手法 Python

Pythonでデータ処理を行っていると、既存の2次元配列(リストのリスト)に対して、「新しいデータ行を追加したい」「既存のデータに新しい項目の列を足したい」という場面が頻繁に訪れます。

しかし、Pythonには標準の「リスト型」と、数値計算ライブラリの「NumPy配列」という2つの主要な配列があり、それぞれ要素を追加する方法が全く異なります。

ここを混同すると、意図しないエラーやパフォーマンスの低下を招く原因となります。

この記事では、Pythonの標準リストとNumPy配列のそれぞれについて、行(縦方向)や列(横方向)を追加する具体的なコードとその仕組みを徹底解説します。

初心者の方が迷いやすい「空の配列から動的に作る方法」も紹介しますので、ぜひ参考にしてください。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

Pythonの標準リストで2次元配列に行(データセット)を追加する

Pythonの標準機能であるリスト型(list)を使って2次元配列を扱う場合、行の追加は非常に直感的で簡単です。

リストのメソッドである append()extend() を使うことで、Excelの表に行を足していくような操作が可能です。

appendメソッドで末尾に1行追加する

最も基本となるのが append() メソッドです。
これはリストの末尾に、新しい要素(ここでは1行分のリスト)をそのまま追加します。

# 2次元配列(リストのリスト)の初期化
matrix = [
    [1, 2, 3],
    [4, 5, 6]
]

# 追加したい新しい行
new_row = [7, 8, 9]

# appendを使って末尾に追加
matrix.append(new_row)

print(matrix)

実行結果

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

matrix.append(new_row) を実行することで、元のリスト matrix の一番後ろに [7, 8, 9] というリストが1つの要素として追加されます。

これにより、2行3列だった配列が、3行3列の配列になりました。処理速度も速く、最も頻繁に使われる方法です。

extendメソッドや+=演算子で複数の行を結合する

1行だけでなく、複数の行をまとめて追加したい場合は extend() メソッドか += 演算子を使います。

append でリストを追加すると「リストの中にリストが入る」形になりますが、extend は「リストの中身を展開して追加」します。

matrix = [
    [1, 2],
    [3, 4]
]

# 追加したい複数の行
additional_rows = [
    [5, 6],
    [7, 8]
]

# extendを使って結合
matrix.extend(additional_rows)
# matrix += additional_rows  # これでも同じ結果になります

print(matrix)

実行結果

[[1, 2], [3, 4], [5, 6], [7, 8]]

extend() は引数に渡されたリストの要素を、元のリストの末尾に順番に追加します。

ここでは additional_rows が2次元配列(リストのリスト)なので、その要素である [5, 6][7, 8] がそれぞれ matrix に追加され、結果として行が増える形になります。

insertメソッドで好きな位置に行を挿入する

末尾ではなく、先頭や途中に割り込ませる形でデータを追加したい場合は insert() メソッドを使用します。

matrix = [
    [1, 2],
    [5, 6]
]

new_row = [3, 4]

# インデックス1(2番目)の位置に挿入
matrix.insert(1, new_row)

print(matrix)

実行結果

[[1, 2], [3, 4], [5, 6]]

insert(挿入したいインデックス, 要素) の形式で指定します。

上記の例ではインデックス 1 を指定しているため、元々インデックス0にあった [1, 2] の後ろ、インデックス1にあった [5, 6] の前に新しい行が挿入されました。

Pythonの標準リストで「列」を追加する方法

行の追加に比べて、リスト型での「列」の追加(各行に新しい要素を一つずつ足す処理)は少し工夫が必要です。

リストには「列を追加する」という直接的なメソッドが存在しないため、ループ処理などを使って各行を更新する必要があります。

forループを使って各行に要素を追加する

最も基本的で分かりやすいのが、for 文を使って各行にアクセスし、append() で要素を足していく方法です。

matrix = [
    [1, 2],
    [3, 4],
    [5, 6]
]

# 追加したい列のデータ
new_column = [10, 20, 30]

# 行数と追加するデータの数が合っているか確認するのが安全
if len(matrix) == len(new_column):
    for i in range(len(matrix)):
        # i番目の行に、i番目のデータを追加
        matrix[i].append(new_column[i])

print(matrix)

実行結果

[[1, 2, 10], [3, 4, 20], [5, 6, 30]]

for i in range(len(matrix)): で行の数だけループを回しています。

matrix[i] でi番目の行(リスト)を取得し、そこに append() で新しい列のデータ new_column[i] を追加しています。

これにより、縦方向にデータが結合されたように見えます。

zip関数を使ったスマートな列追加テクニック

リスト内包表記と zip() 関数を組み合わせると、よりPythonらしい簡潔な書き方で列を追加できます。

matrix = [
    [1, 2],
    [3, 4]
]

new_column = [9, 9]

# zipで既存の行と新しい値をペアにして、新しいリストを作成
# xは元の行(例: [1, 2])、yは追加する値(例: 9)
new_matrix = [x + [y] for x, y in zip(matrix, new_column)]

print(new_matrix)

実行結果

[[1, 2, 9], [3, 4, 9]]

zip(matrix, new_column) は、元の行 [1, 2] と追加データ 9 をセットにして取り出します。

リスト内包表記の中で x + [y] を行うことで、[1, 2] + [9] すなわち [1, 2, 9] という新しい行を作成し、それを集めて新しい2次元配列を構築しています。

注意点として、この操作は元のリスト matrix を変更する(破壊的操作)のではなく、新しいリスト new_matrix を生成します。
メモリ使用量や変数の扱いに気を付けてください。

空の2次元配列を定義して動的に要素を追加していく手順

データ処理の現場では、最初は空の状態からスタートし、計算結果を順次追加していくパターンがよくあります。

ここでは空の配列を定義し、データを蓄積していく実装例を紹介します。

空リストから始めてデータを蓄積する

# 空のリストを定義
data_matrix = []

# 何かの処理ループ(例:0から2まで)
for i in range(3):
    # 計算などで新しい行データを作成
    row = [i, i * 10, i * 100]
    
    # 2次元配列に追加
    data_matrix.append(row)

print(data_matrix)

実行結果

[[0, 0, 0], [1, 10, 100], [2, 20, 200]]

最初に data_matrix = [] で空のリストを用意します。

ループの中で row という1行分のリストを作成し、それを data_matrix.append(row) で積み上げていきます。

CSVファイルの読み込みや、ログデータの解析などで頻繁に使用されるパターンです。

NumPy配列(ndarray)で行や列を追加する方法

数値計算ライブラリ「NumPy」を使う場合、リストとは異なる専用の関数を使用します。

NumPy配列は計算速度が速い反面、「配列のサイズ変更」は新しい配列を生成する処理になるため、頻繁な追加はパフォーマンスを低下させる可能性がある点に注意が必要です。

np.appendで追加する(axisの指定が重要)

np.append() 関数を使うと、配列に要素を追加できます。
重要なのは axis(軸)の指定です。

import numpy as np

# 2行3列のNumPy配列
arr = np.array([
    [1, 2, 3],
    [4, 5, 6]
])

# 追加する行(2次元配列として定義する点に注意)
new_row = np.array([[7, 8, 9]])

# axis=0 は「行(縦方向)」への追加
result = np.append(arr, new_row, axis=0)

print(result)

実行結果

[[1 2 3]
 [4 5 6]
 [7 8 9]]

np.append(元の配列, 追加する配列, axis=0) で行を追加します。

注意点として、追加する new_row[[...]] のように2次元配列の形状をしている必要があります。

axis=0 を指定しないと、すべての要素が1列に平坦化されてしまうので気をつけましょう。

【重要】NumPy配列をforループで拡張してはいけない

NumPyの np.append は、実行するたびに新しいメモリ領域の確保と全データのコピーを行います。
そのため、forループの中で arr = np.append(arr, new_row) のように繰り返し実行すると、データ量が増えるにつれて処理時間が指数関数的に遅くなります(計算量が O(N^2) になります)。

データを順次追加したい場合は、以下のいずれかの方法が推奨されます。

  1. Pythonの標準リストで append して、最後に np.array() でNumPy配列に変換する(最も手軽で高速)
  2. 予め np.zeros などで十分なサイズの配列を確保し、インデックスで値を代入する(サイズが分かっている場合)

np.vstackとnp.hstackで行・列を結合する

より直感的に行や列を追加(結合)したい場合は、vstack(垂直結合)と hstack(水平結合)が便利です。

import numpy as np

arr = np.array([
    [1, 2],
    [3, 4]
])

# 行を追加(Vertical Stack:垂直方向に積む)
row_to_add = np.array([5, 6])
result_v = np.vstack((arr, row_to_add))
print("行追加:\n", result_v)

# 列を追加(Horizontal Stack:水平方向に積む)
# 列ベクトルとして形状を合わせる必要がある
col_to_add = np.array([
    [10],
    [20]
])
# 単なる [10, 20] だと形状不一致エラーになることがあるため、必要なら reshape などを検討する
# 今回は2次元配列としての整合性を保つため、最初から [[10], [20]] の形で定義するか
# col_to_add.reshape(-1, 1) とするのが安全です。

result_h = np.hstack((arr, col_to_add))
print("列追加:\n", result_h)

実行結果

行追加:
 [[1 2]
 [3 4]
 [5 6]]
列追加:
 [[ 1  2 10]
 [ 3  4 20]]

コードの解説

  • np.vstack: 配列を縦に積み重ねます。行の追加に相当します。
  • np.hstack: 配列を横に連結します。列の追加に相当します。ただし、追加する配列の「行数」が元の配列と一致している必要があります。また、列を追加する場合は、追加するデータも列ベクトル( (N, 1) の形状)である必要があります。

np.insertでインデックスを指定して挿入する

リストの insert と同様に、NumPyでも np.insert で場所を指定して追加が可能です。

import numpy as np

arr = np.array([
    [1, 2, 3],
    [7, 8, 9]
])

# 1行目(インデックス1)の前に新しい行を挿入
# axis=0 は行方向
result = np.insert(arr, 1, [4, 5, 6], axis=0)

print(result)

実行結果

[[1 2 3]
 [4 5 6]
 [7 8 9]]

np.insert(配列, インデックス, 値, axis=軸) を使います。

axis=0 なら指定したインデックスの「行」として挿入され、axis=1 なら「列」として挿入されます。

特定の位置にデータを差し込みたい場合に非常に有効です。

Pythonのスキルを活かして年収を上げる方法

以上、Pythonで2次元配列に行・列を追加する方法について解説してきました。

なお、Pythonのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

Pythonエンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなPythonの案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。