numpy.deleteは、配列から任意の要素を削除することができる関数です。削除する要素は、インデックスで指定します。1次元配列と2次元以上の配列の場合で、インデックスの指定の方法が異なります。
実際のコードで確認していきましょう。
1. numpy.deleteの使い方
numpy.deleteの書き方は次の通りです。
書き方:
np.delete(arr, obj, axis=None)
パラメーター:
引数 | 型 | 解説 |
arr | array_like | ここに指定した配列から要素を削除します(元の配列は変化しません)。 |
obj | int, slice | 削除する要素のインデックスを指定します。複数の要素を削除したい場合は、インデックスをタプル型かリスト型で指定します。slice()やnp.s[]を使って、スライスで指定することもできます。 |
axis(optional) | int | 要素を削除する軸を指定します。2次元以上の配列への要素の追加で、これを指定しない場合、戻り値は1次元配列になります。 |
戻り値:
要素を削除した新しいndarray |
一緒に確認したい関数:
それでは実際のコードで確認していきましょう。
1.1. 1次元配列の要素を削除する
まずは1次元配列の要素を削除する場合を見ていきます。
以下のコードでは、arr1のインデックス2番の要素を削除した、新しい配列arr2を生成しています。なお、コード中で使用しているnp.arangeは、『numpy.arange – 色々な連番の配列を生成する方法』で解説しています。
また、インデックス番号については、『Pythonのリストからの要素の取り出し方法まとめ』で解説していますので、復習したい場合は、ぜひご確認ください。
import numpy as np
# 元の配列を生成。
arr1 = np.arange(6)
# [2]の位置の要素を削除した新しい配列を生成。
arr2 = np.delete(arr1, 2)
print('元の配列\n', arr1, '\n')
print('要素を削除した新しい配列\n', arr2)
元の配列arr1が変更されるのではなく、指定のインデックスの要素を削除した新しい配列を生成しているという点をおさえておきましょう。
次のように、インデックス番号を複数指定すれば、複数の要素を一度に削除することができます。
# 元の配列を生成。
arr3 = np.arange(1, 13)
# 複数の要素を削除。
arr4 = np.delete(arr3, [0, 2, 4, 6, 8, 10])
# スライスで要素を指定したい場合slice()を使う。
arr5 = np.delete(arr3, slice(2, 10))
# np.s_[]でスライスを指定してもOK。
arr6 = np.delete(arr3, np.s_[1::2])
print('arr3: 元の配列\n', arr3, '\n')
print('arr4: np.delete(arr3, [0, 2, 4, 6, 8, 10])\n', arr4, '\n')
print('arr5: np.delete(arr3, slice(2, 10))\n', arr5, '\n')
print('arr6: np.delete(arr3, np.s_[1::2])\n', arr6)
1.2. 2次元配列の要素を削除する
続いて、2次元の配列から要素を削除する方法を見ていきましょう。
この場合、axisを指定しなければ戻り値は1次元配列になります。axis=0で行を、axis=1で列を削除します。
それぞれ見ていきましょう。
1.2.1. axisを指定しない場合は1次元配列で戻る
まず、オプション引数のaxis=を指定しない場合は、1次元配列となって戻ってきます。
# 元の配列を生成。
arr7 = np.arange(6).reshape(2, 3)
# 要素を削除した新しい配列
arr8 = np.delete(arr7, [1, 3])
print('arr7: 元の配列\n', arr7, '\n')
print('arr8: np.delete(arr7, [1, 3])\n', arr8)
3次元以上の配列の場合でも、同様に戻り値は1次元配列になります。
1.2.2. axis=0で行(横軸)を削除
axis=0を指定すると、指定の行を削除します。以下、実際のコードで確認しておきましょう。
import numpy as np
# 元の配列を生成。
arr9 = np.arange(15).reshape(5, 3)
# axis=0にすると指定の行を削除します。
arr10 = np.delete(arr9, 1, axis=0)
# 複数の行([0]と[1])を一度に削除
arr11 = np.delete(arr9, [0, 2], axis=0)
# slice()でスライス指定
arr12 = np.delete(arr9, slice(3, 5), axis=0)
# np.s_[]でスライスで指定
arr13 = np.delete(arr9, np.s_[1:-1], axis=0)
print('arr9: 元の配列\n', arr9, '\n')
print('arr10: np.delete(arr9, 1, axis=0)\n', arr10, '\n')
print('arr11: np.delete(arr9, [0, 2], axis=0)\n', arr11, '\n')
print('arr12: np.delete(arr9, slice(3, 5), axis=0)\n', arr12, '\n')
print('arr13: np.delete(arr9, np.s_[1:-1], axis=0)\n', arr13)
1.2.3. axis=1で列を削除
axis=1を指定した時は、指定した位置の列を削除します。以下のコードで一通り確認しておきましょう。
import numpy as np
# 元の配列を生成。
arr14 = np.arange(15).reshape(3, 5)
# axis=1にすると指定の列を削除します。
arr15 = np.delete(arr14, 1, axis=1)
# 複数の行([0]と[1])を一度に削除
arr16 = np.delete(arr14, [0, 2], axis=1)
# slice()でスライス指定
arr17 = np.delete(arr14, slice(3, 5), axis=1)
# np.s_[]でスライスで指定
arr18 = np.delete(arr14, np.s_[1:-1], axis=1)
print('arr14: 元の配列\n', arr14, '\n')
print('arr15: np.delete(arr14, 1, axis=1)\n', arr15, '\n')
print('arr16: np.delete(arr14, [0, 2], axis=1)\n', arr16, '\n')
print('arr17: np.delete(arr14, slice(3, 5), axis=1)\n', arr17, '\n')
print('arr18: np.delete(arr14, np.s_[1:-1], axis=1)\n', arr18)
2. まとめ
numpy.deleleの使い方は以上の通りです。
実際にコードを書いて、削除したい要素のインデックスの指定の仕方に慣れていきましょう。
なお、3次元配列以上は触れていませんが、その場合は、axis=0で奥行き、axis=1で行、axis=2で列を削除するというように、axisで指定できる軸が増えていきます。
また、numpy.delete()と合わせて、以下の操作もおさえておくとよいでしょう。
ぜひ、参考にして頂ければと思います。
コメント