import numpy as np
print(np.__version__)
# 1.26.1
詳細は後述するが、例えば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始まりで指定する。存在しないインデックスを指定するとエラー。
対象の軸(次元)は次に説明する第三引数axis
で指定する。ここではaxis=0
で行が対象。
a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
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次元配列の場合、行が0次元目、列が1次元目となる。存在しない次元を指定するとエラー。
a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
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
にリストやスライスを指定すると、複数の行・列を一括で削除できる。
リストで指定
削除したい行番号・列番号をリストで指定する。
a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(np.delete(a, [0, 2], 0))
# [[4 5 6 7]]
print(np.delete(a, [0, 3], 1))
# [[ 1 2]
# [ 5 6]
# [ 9 10]]
NumPy1.19
から、ブール値のリストや配列がマスクとして扱われるようになった。True
に対応するインデックスが削除される。指定した要素数と次元のサイズが一致していないとエラー。
print(np.delete(a, [True, False, True], 0))
# [[4 5 6 7]]
print(np.delete(a, [True, False, False, True], 1))
# [[ 1 2]
# [ 5 6]
# [ 9 10]]
# print(np.delete(a, [True, False, True], 1))
# ValueError: boolean array argument obj to delete must be one dimensional and match the axis length of 4
スライスで指定
[start:stop:step]
で範囲を指定するスライスを用いて複数の行・列を指定することも可能。
スライスおよびslice()
によるスライスオブジェクトについての詳細は以下の記事を参照。
関連記事: Pythonのスライスによるリストや文字列の部分選択・代入
slice()を使用
slice()
でスライスオブジェクトを生成し、第二引数obj
に指定する。
引数が1つだけの場合は[:stop]
、引数が2つの場合は[start:stop]
、3つの場合は[start:stop:step]
に相当する。省略する場合は明示的にNone
とする。
a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
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_を使用
numpy.s_[]
を使うとスライス[start:stop:step]
の形で記述できる。省略も可能。
numpy.s_ — NumPy v1.26 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()
を繰り返し適用する。
a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
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, SciPyでトリム平均を算出(ndarray, DataFrame)
NumPy配列ndarrayのサイズ1の次元を削除するnp.squeeze()
NumPyのバージョンを確認(np.version)
NumPy配列ndarrayの要素・行・列を取得(抽出)、代入
NumPy配列ndarrayの下三角行列・上三角行列を抽出・生成(tril, triu, tri)
NumPy配列ndarrayに要素・行・列を挿入、追加するinsertの使い方
Python, OpenCV, Pillow(PIL)で画像サイズ(幅、高さ)を取得
pandas参考書『Python for Data Analysis, 2nd Edition』
NumPy, pandasのValueError: The truth value ... is ambiguousの対処法
NumPy配列ndarrayを任意の最小値・最大値に収めるclip
『Python Data Science Handbook』(英語の無料オンライン版あり)
NumPyのsortとargsort関数で任意の行・列を基準にソート
NumPyのarange, linspaceの使い方(連番や等差数列を生成)
NumPy配列ndarrayの符号(正負)を取得・判定・置換
Python, OpenCV, NumPyで画像のアルファブレンドとマスク処理