NumPy insert関数完全ガイド|配列ndarrayに要素・行・列を挿入する使い方とサンプルコード
NumPyのinsert関数は、配列(ndarray)に新しい要素、行、列を挿入するための強力なツールです。本記事では、numpy.insert()の基本的な使い方から応用例まで、実践的なサンプルコードとともに詳しく解説します。
numpy.insert()とは
numpy.insert()は、指定した位置にNumPy配列の要素を挿入する関数です。元の配列を変更することなく、新しい配列を返します。
基本構文:
numpy.insert(arr, obj, values, axis=None)
パラメータ:
arr: 挿入対象の配列obj: 挿入位置のインデックスvalues: 挿入する値axis: 挿入する軸(None, 0, 1など)
1次元配列への要素挿入
基本的な要素挿入
import numpy as np
# 1次元配列の作成
arr = np.array([1, 2, 3, 4, 5])
print("元の配列:", arr)
# インデックス2の位置に10を挿入
result = np.insert(arr, 2, 10)
print("挿入後:", result)
# 出力: [1 2 10 3 4 5]
複数の要素を同時挿入
# 複数の値を挿入
arr = np.array([1, 2, 3, 4, 5])
result = np.insert(arr, 2, [10, 20])
print("複数挿入:", result)
# 出力: [1 2 10 20 3 4 5]
配列の先頭と末尾への挿入
arr = np.array([2, 3, 4])
# 先頭に挿入
front = np.insert(arr, 0, 1)
print("先頭挿入:", front)
# 出力: [1 2 3 4]
# 末尾に挿入
back = np.insert(arr, len(arr), 5)
print("末尾挿入:", back)
# 出力: [2 3 4 5]
2次元配列への行挿入(axis=0)
新しい行の挿入
# 2次元配列の作成
arr_2d = np.array([[1, 2, 3],
[4, 5, 6]])
print("元の配列:")
print(arr_2d)
# 1行目に新しい行を挿入
new_row = np.array([7, 8, 9])
result = np.insert(arr_2d, 1, new_row, axis=0)
print("行挿入後:")
print(result)
# 出力:
# [[1 2 3]
# [7 8 9]
# [4 5 6]]
複数行の同時挿入
arr_2d = np.array([[1, 2],
[3, 4]])
# 複数行を挿入
new_rows = np.array([[5, 6], [7, 8]])
result = np.insert(arr_2d, 1, new_rows, axis=0)
print("複数行挿入:")
print(result)
# 出力:
# [[1 2]
# [5 6]
# [7 8]
# [3 4]]
先頭と末尾への行挿入
arr_2d = np.array([[2, 3],
[4, 5]])
# 先頭に行挿入
first_row = np.insert(arr_2d, 0, [1, 1], axis=0)
print("先頭行挿入:")
print(first_row)
# 末尾に行挿入
last_row = np.insert(arr_2d, arr_2d.shape[0], [6, 7], axis=0)
print("末尾行挿入:")
print(last_row)
2次元配列への列挿入(axis=1)
新しい列の挿入
# 2次元配列の作成
arr_2d = np.array([[1, 2, 4],
[5, 6, 8]])
print("元の配列:")
print(arr_2d)
# 2列目に新しい列を挿入
new_col = np.array([3, 7])
result = np.insert(arr_2d, 2, new_col, axis=1)
print("列挿入後:")
print(result)
# 出力:
# [[1 2 3 4]
# [5 6 7 8]]
複数列の同時挿入
arr_2d = np.array([[1, 4],
[5, 8]])
# 複数列を挿入
new_cols = np.array([[2, 3], [6, 7]])
result = np.insert(arr_2d, 1, new_cols, axis=1)
print("複数列挿入:")
print(result)
# 出力:
# [[1 2 3 4]
# [5 6 7 8]]
列の先頭と末尾への挿入
arr_2d = np.array([[2, 3],
[5, 6]])
# 先頭に列挿入
first_col = np.insert(arr_2d, 0, [1, 4], axis=1)
print("先頭列挿入:")
print(first_col)
# 末尾に列挿入
last_col = np.insert(arr_2d, arr_2d.shape[1], [4, 7], axis=1)
print("末尾列挿入:")
print(last_col)
axis=Noneの動作(1次元化)
# 2次元配列をaxis=Noneで1次元化して挿入
arr_2d = np.array([[1, 2],
[3, 4]])
result = np.insert(arr_2d, 2, 99, axis=None)
print("axis=None:", result)
# 出力: [1 2 99 3 4]
高次元配列での応用
3次元配列への挿入
# 3次元配列の作成
arr_3d = np.array([[[1, 2], [3, 4]],
[[5, 6], [7, 8]]])
print("3次元配列の形状:", arr_3d.shape)
# axis=0で挿入
new_layer = np.array([[9, 10], [11, 12]])
result = np.insert(arr_3d, 1, new_layer, axis=0)
print("挿入後の形状:", result.shape)
print("挿入結果:")
print(result)
データ型を考慮した挿入
整数配列への浮動小数点挿入
# 整数配列
int_arr = np.array([1, 2, 3], dtype=int)
print("元の型:", int_arr.dtype)
# 浮動小数点を挿入
result = np.insert(int_arr, 1, 2.5)
print("挿入後:", result)
print("挿入後の型:", result.dtype)
# 出力: [1 2 3] (2.5は2に変換される)
型変換を伴う挿入
# 明示的な型指定
float_arr = np.array([1.1, 2.2, 3.3])
result = np.insert(float_arr, 1, 10)
print("浮動小数点配列:", result)
print("型:", result.dtype)
実践的な応用例
データフレーム風の操作
# 学生の成績データ
scores = np.array([[85, 92, 78],
[91, 88, 85],
[79, 94, 90]])
# 新しい学生の成績を追加
new_student = np.array([88, 89, 92])
updated_scores = np.insert(scores, 1, new_student, axis=0)
print("更新された成績:")
print(updated_scores)
# 新しい科目の成績を追加
new_subject = np.array([90, 87, 89, 91])
final_scores = np.insert(updated_scores, 3, new_subject, axis=1)
print("科目追加後:")
print(final_scores)
時系列データの挿入
# 時系列データ
time_data = np.array([10, 15, 20, 30])
# 欠損値を補間するように挿入
interpolated = np.insert(time_data, 2, 17.5)
print("補間後:", interpolated)
# 出力: [10. 15. 17.5 20. 30. ]
パフォーマンスの考慮事項
大きな配列での注意点
import time
# 大きな配列でのパフォーマンステスト
large_arr = np.random.rand(10000)
# 挿入処理の時間測定
start = time.time()
result = np.insert(large_arr, 5000, 999)
end = time.time()
print(f"挿入処理時間: {end - start:.6f}秒")
print(f"元の配列サイズ: {large_arr.size}")
print(f"挿入後サイズ: {result.size}")
メモリ効率的な代替手段
# appendとの比較
arr = np.array([1, 2, 3])
# insert使用
insert_result = np.insert(arr, len(arr), 4)
# append使用(末尾追加の場合)
append_result = np.append(arr, 4)
print("insert結果:", insert_result)
print("append結果:", append_result)
# 両方とも同じ結果: [1 2 3 4]
エラーハンドリング
よくあるエラーと対処法
# インデックスエラー
try:
arr = np.array([1, 2, 3])
# 範囲外インデックス(エラーにならない)
result = np.insert(arr, 10, 999)
print("範囲外挿入:", result)
except Exception as e:
print("エラー:", e)
# 次元不一致エラー
try:
arr_2d = np.array([[1, 2], [3, 4]])
# 不適切な形状での挿入
wrong_shape = np.insert(arr_2d, 1, [1, 2, 3], axis=0)
except ValueError as e:
print("形状エラー:", e)
安全な挿入処理
def safe_insert(arr, index, values, axis=None):
"""安全な挿入処理"""
try:
# インデックスの範囲チェック
if axis is None:
max_index = arr.size
else:
max_index = arr.shape[axis]
if index < 0 or index > max_index:
print(f"警告: インデックス {index} は範囲外です")
index = max(0, min(index, max_index))
return np.insert(arr, index, values, axis=axis)
except Exception as e:
print(f"挿入エラー: {e}")
return arr
# 使用例
arr = np.array([1, 2, 3])
result = safe_insert(arr, 10, 999)
print("安全な挿入:", result)
まとめ
numpy.insert()は配列操作において非常に有用な関数です。重要なポイントを整理すると:
基本的な使い方:
- 1次元配列:
np.insert(arr, index, value) - 行挿入:
np.insert(arr, index, values, axis=0) - 列挿入:
np.insert(arr, index, values, axis=1)
注意点:
- 元の配列は変更されず、新しい配列が返される
- データ型の変換が自動で行われる場合がある
- 大きな配列では処理時間に注意が必要
応用のコツ:
- 複数の値や行・列を同時挿入可能
- 3次元以上の配列でも同様に使用可能
- エラーハンドリングを適切に行う
NumPyのinsert関数を効果的に活用することで、配列操作がより柔軟かつ効率的になります。データ分析や科学計算において、配列の動的な変更が必要な場面で積極的に活用してください。

