numpy.insertは、配列の任意の位置に要素を挿入する関数です。要素を挿入する位置はインデックスで指定します。追加する要素は、追加先の配列の次元数や行数、列数(要素数)に合うように指定します。
実際のコードで確認していきましょう。
1. numpy.insertの使い方
numpy.insertの使い方は以下の通りです。
書き方:
np.insert(arr, obj, values, axis=None)
パラメーター:
引数 | 型 | 解説 |
arr | array_like | ここに指定した配列に要素を挿入します(元の配列は変化しません)。 |
obj | int, slice | 要素を挿入する場所のインデックスを指定します。複数の場所に挿入したい場合は、インデックスをタプル型かリスト型で渡します。 |
values | array_like | ここに指定した要素または配列が、上の配列に挿入されます。 |
axis(optional) | int | 要素を挿入する軸を指定します。2次元以上の配列への要素の挿入で、これを指定しない場合、戻り値は1次元配列になります。 |
戻り値:
要素を挿入したndarray |
一緒に確認したい関数:
- append: 配列の末尾に要素を追加
- concatenate: 複数の配列を連結
- delete: 配列から要素を削除
それでは実際のコードで確認していきましょう。
1.1. 1次元配列に要素を挿入する
まずは1次元配列に要素を挿入する場合を見ていきます。
以下のコードでは、arr1のインデックス2番の位置に指定の要素を挿入した、新しい配列arr2を生成しています。なお、コード中で使用しているnp.arangeは、『numpy.arange – 色々な連番の配列を生成』で解説しています。
import numpy as np
# 元の配列arr1を生成
arr1 = np.arange(5)
# [2]の位置に要素を挿入したarr2を生成
arr2 = np.insert(arr1, [2], 100)
# 確認
print('arr1: 元の配列は変化しません。\n', arr1, '\n')
print('arr2: 要素を挿入した新しい配列を生成します。\n', arr2)
元の配列arr1が変更されるのではなく、指定の要素を挿入した新しい配列を生成している点をおさえておきましょう。
次に、複数の要素を同時に挿入する場合を見ておきましょう。
以下のコードをご確認ください。
# 元となる配列を生成。
arr3 = np.arange(6)
# [2]の位置に複数の要素を挿入。
arr4 = np.insert(arr3, [2], [10, 11])
# 挿入位置を複数指定。
arr5 = np.insert(arr3, [2, 4], [10, 11])
# 挿入位置をslice関数で指定。
arr6 = np.insert(arr3, slice(2, 4), [10, 11])
print('arr3: 元の配列\n', arr3, '\n')
print('arr4: np.insert(arr3, [2], [10, 11])\n', arr4,'\n')
print('arr5: np.insert(arr3, [2, 4], [10, 11])\n', arr5,'\n')
print('arr6: np.insert(arr3, slice(2, 4), [10, 11])\n', arr6)
それぞれ指定の位置に要素が挿入されています。挿入位置の指定にslice関数を使った時は、挿入位置が異なります。
なお、配列の要素の型(dtype)と、挿入する要素の型が異なる時は、配列の要素の型に合わせられます。dtypeについては、『NumPyのdtype属性の一覧と参照・指定・変更方法』で解説しています。
# データ型が異なる要素の場合、配列の要素に変換して挿入。
arr7 = np.insert(arr3, [2], [7.5, False])
print('arr3: 元の配列\n', arr3, '\n')
print('arr7: np.insert(arr3, [2], [7.5, False])\n', arr7)
1.2. 2次元配列に要素を挿入する
続いて2次元配列に要素を挿入する場合を見ていきましょう。
この場合、オプション引数の「axis=」をどのように指定するかによって、戻り値が異なります。
1.2.1. axisを指定しない場合は1次元配列で戻ってくる
次に、2次元配列に要素を挿入してみます。以下のコードのように、オプション引数のaxis=を指定しない場合、1次元配列になって戻ってきます。
''' axisを指定しない場合は1次元配列が戻ってきます。 '''
# 2次元配列を生成
arr8 = np.arange(9).reshape(3, 3)
# [4]の位置に要素を挿入
arr9 = np.insert(arr8, [4], 100)
# 確認
print('arr8: 元の配列は2次元配列です。\n', arr8, '\n')
print('arr9:1次元配列で戻ってきます。\n', arr9)
1.2.2. axis=0で行(横軸)を挿入
次に、2次元配列で、axis=0を指定して要素を挿入してみましょう。この場合、新しい行として挿入されます。
''' axis=0の場合、要素が行として挿入されます。 '''
# 2番目の行を挿入
arr10 = np.insert(arr8, [1], 10, axis=0)
# 複数の行を挿入する場合(挿入する要素の次元数を合わせておく)。
arr11 = np.insert(arr8, 1, [[10], [20]], axis=0)
# 複数の位置に異なる行を挿入する場合。
arr12 = np.insert(arr8, [1, 2], [[10], [20]], axis=0)
# このように挿入することも可能です。
arr13 = np.insert(arr8, [1], [[10, 20, 30]], axis=0)
print('arr8: 元の配列\n', arr8, '\n')
print('arr10: np.insert(arr8, [1], 10, axis=0)\n', arr10, '\n')
print('arr11: np.insert(arr8, 1, [[10], [20]], axis=0)\n', arr11, '\n')
print('arr12: np.insert(arr8, [1, 2], [[10], [20]], axis=0)\n', arr12, '\n')
print('arr13: np.insert(arr8, [1], [[10, 20, 30]], axis=0)\n', arr13)
1.2.3. axis=1で列(縦軸)を挿入
続いて、axis=0にした場合は列を軸として要素が挿入されます。
''' axis=1の場合、列を軸として挿入されます。 '''
arr14 = np.arange(6).reshape(3, 2)
# 全ての行の[1]に10を挿入。
arr15 = np.insert(arr14, [1], 10, axis=1)
# 全ての行の[1]に[10, 20, 30]を挿入。
arr16 = np.insert(arr14, [1], [10, 20, 30], axis=1)
# 全ての行の複数位置に同じ要素を挿入。
arr17 = np.insert(arr14, [0, 1, 2], [10], axis=1)
# 全ての行の複数位置に指定の要素を挿入。
arr18 = np.insert(arr14, [0, 1, 2], [10, 20, 30], axis=1)
print('arr14: 元の配列\n', arr14, '\n')
print('arr15: np.insert(arr14, [1], 10, axis=1)\n', arr15, '\n')
print('arr16: np.insert(arr14, [1], [10, 20, 30], axis=1)\n', arr16, '\n')
print('arr17: np.insert(arr14, [0, 1, 2], [10], axis=1)\n', arr17, '\n')
print('arr18: np.insert(arr14, [0, 1, 2], [10, 20, 30], axis=1)\n', arr18)
2. まとめ
以上がnumpy.insertの使い方です。以下の関数も確認しておくと良いでしょう。
- numpy.append: 配列の末尾に要素を追加
- concatenate: 複数の配列を連結
- delete: 配列から要素を削除
コメント