NumPyで任意の行・列を削除するdeleteの使い方

NumPyの関数delete()で、NumPy配列ndarrayから任意の行・列などを削除できます。

numpy.delete — NumPy v1.15 Manual

削除対象となる軸(次元)と削除する位置(行番号や列番号など)を指定します。行・列番号はスライスやリストで複数選択することも可能。 ここでは以下の内容について説明します。

numpy.delete()の基本的な使い方 削除するインデックス(行・列番号)を指定: 引数obj 削除対象の軸(次元)を指定: 引数axis

複数の行・列を一括で削除 リストで指定 スライスで指定 行と列を削除

三次元以上の多次元配列の場合の例

インデックスによる位置の指定ではなく条件に応じて要素・行・列を削除したい場合は、以下の記事を参照。

numpy.delete()の基本的な使い方

numpy.delete()には以下の3つの引数を指定します。

numpy.delete(arr, obj, axis=None)

arr: 入力配列 obj: 削除する行番号や列番号を整数、スライス、リスト(配列)で指定 axis: 削除対象となる軸(次元)

以下の2次元配列を例とします。

import numpy as np

a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

詳細は後述するが、例えば2行目を削除する場合はobj=1, axis=0とします。元の配列は変更されず、配列のコピーが新たに生成される。

a_del = np.delete(a, 1, 0)
print(a_del)
# [[ 0  1  2  3]
#  [ 8  9 10 11]]

print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

削除するインデックス(行・列番号)を指定: 引数obj

第二引数objには削除するインデックス(行番号・列番号)を0始まりで指定します。存在しないインデックスを指定するとエラー。

print(np.delete(a, 0, 0))
# [[ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.delete(a, 2, 0))
# [[0 1 2 3]
#  [4 5 6 7]]

# print(np.delete(a, 3, 0))
# IndexError: index 3 is out of bounds for axis 0 with size 3

削除対象の軸(次元)を指定: 引数axis

第三引数axisには削除対象となる軸(次元)を0始まりで指定します。2次元配列の場合、行が1次元目(0始まりの0)、列が2次元目(0始まりの1)となります。存在しない次元を指定するとエラー。

print(np.delete(a, 1, 0))
# [[ 0  1  2  3]
#  [ 8  9 10 11]]

print(np.delete(a, 1, 1))
# [[ 0  2  3]
#  [ 4  6  7]
#  [ 8 10 11]]

# print(np.delete(a, 1, 2))
# AxisError: axis 2 is out of bounds for array of dimension 2

axis=Noneとすると1次元に平坦化された上でobjで指定したインデックスの要素が削除される。axisのデフォルトはNoneなので省略するとこの動作になる。

print(np.delete(a, 1, None))
# [ 0  2  3  4  5  6  7  8  9 10 11]

print(np.delete(a, 1))
# [ 0  2  3  4  5  6  7  8  9 10 11]

複数の行・列を一括で削除

第二引数objにリストやスライスを指定すると、複数の行・列を一括で削除できます。

リストで指定

削除したい行番号・列番号をリストで指定します。

print(np.delete(a, [0, 3], 1))
# [[ 1  2]
#  [ 5  6]
#  [ 9 10]]

print(np.delete(a, [0, 1, 3], 1))
# [[ 2]
#  [ 6]
#  [10]]

スライスで指定

[start:stop:step]で範囲を指定するスライスを用いて複数の行・列を指定することも可能。 スライスおよびslice()によるスライスオブジェクトについての詳細は以下の記事を参照。

slice()を使用 slice()でスライスオブジェクトを生成し、第二引数objに指定します。 引数が1つだけの場合は[:stop]、引数が2つの場合は[start:stop]、3つの場合は[start:stop:step]に相当します。省略する場合は明示的にNoneとします。

print(np.delete(a, slice(2), 1))
# [[ 2  3]
#  [ 6  7]
#  [10 11]]

print(np.delete(a, slice(1, 3), 1))
# [[ 0  3]
#  [ 4  7]
#  [ 8 11]]

print(np.delete(a, slice(None, None, 2), 1))
# [[ 1  3]
#  [ 5  7]
#  [ 9 11]]

np.s_を使用 スライス[start:stop:step]の形で記述したい場合はnumpy.s_[]を使います。省略する場合などの書き方もスライスと同じ。

numpy.s_ — NumPy v1.15 Manual

print(np.delete(a, np.s_[:2], 1))
# [[ 2  3]
#  [ 6  7]
#  [10 11]]

print(np.delete(a, np.s_[1:3], 1))
# [[ 0  3]
#  [ 4  7]
#  [ 8 11]]

print(np.delete(a, np.s_[::2], 1))
# [[ 1  3]
#  [ 5  7]
#  [ 9 11]]

行と列を削除

numpy.delete()で複数次元(行と列など)を一括で削除することはできない。異なる次元を削除する場合はdelete()を繰り返し適用します。

print(np.delete(np.delete(a, 1, 0), 1, 1))
# [[ 0  2  3]
#  [ 8 10 11]]

三次元以上の多次元配列の場合の例 ここまでは、便宜上、行・列といった文言で説明したが、三次元以上の場合も考え方は同じ。以下の配列を例とします。

a_3d = np.arange(24).reshape(2, 3, 4)
print(a_3d)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

print(a_3d.shape)
# (2, 3, 4)

引数axisに次元を指定して、引数objにインデックスを指定すればよい。

print(np.delete(a_3d, 1, 0))
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]]

print(np.delete(a_3d, 1, 1))
# [[[ 0  1  2  3]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [20 21 22 23]]]

print(np.delete(a_3d, 1, 2))
# [[[ 0  2  3]
#   [ 4  6  7]
#   [ 8 10 11]]
#
#  [[12 14 15]
#   [16 18 19]
#   [20 22 23]]]

リストやスライスによる複数指定も同じ。

print(np.delete(a_3d, [0, 3], 2))
# [[[ 1  2]
#   [ 5  6]
#   [ 9 10]]
#
#  [[13 14]
#   [17 18]
#   [21 22]]]

print(np.delete(a_3d, np.s_[::2], 2))
# [[[ 1  3]
#   [ 5  7]
#   [ 9 11]]
#
#  [[13 15]
#   [17 19]
#   [21 23]]]

シェア

関連カテゴリー

Python NumPy

NumPy配列ndarrayに要素・行・列を挿入、追加するinsertの使い方 NumPy配列ndarrayをイミュータブル(書き換え禁止)に設定 Python, NumPyで行列の演算(逆行列、行列式、固有値など) Python, NumPyで画像処理(読み込み、演算、保存) NumPyのデータ型dtype一覧とastypeによる変換(キャスト) NumPyで欠損値np.nanを含む配列ndarrayの合計や平均を算出 NumPyの配列ndarrayの欠損値np.nanを他の値に置換 Pythonでメソッドチェーンを改行して書く NumPy配列ndarrayとPython標準のリストを相互に変換 NumPy配列ndarrayの行・列を任意の順番に並べ替え、選択(抽出) NumPy配列ndarrayをタイル状に繰り返し並べるnp.tile NumPyでCSVファイルを読み込み・書き込み(入力・出力) Python, NumPy(OpenCV)で画像を二値化処理 NumPy配列ndarrayを分割(split, array_split, hsplit, vsplit, dsplit) NumPy配列ndarrayのスライスによる部分配列の選択と代入

Last Updated: 6/26/2019, 10:34:03 PM