numpy – append, insert, delete の使い方

目次

概要

NumPy の配列に要素を追加する apped、要素を挿入する insert、要素を削除する delete、サイズを変更する resize、重複した要素を削除する unique について解説します。

numpy.append

配列の最後に値を追加します。

numpy.append(arr, values, axis=None)
引数
名前 デフォルト値
arr array_like
値はこの配列のコピーに追加されます。
values array_like
これらの値は arr のコピーに追加されます。正しい形状(axis を除いて arr と同じ形状)でなければなりません。axis が指定されていない場合、values はどのような形状でもよく、追加前に平坦化されます。
axis int None
values が追加される軸。axis が指定されていない場合、arrvalues の両方が追加前に平坦化されます。
返り値
名前 説明
append axisvalues を追加した arr のコピー。追加は元に配列に対しては行われないことに注意してください。新しい配列が確保され、値が設定されます。axis が None の場合、out は平坦化された配列です。

サンプルコード

numpy.append() は、配列のコピーを作成し、その末尾に指定した値を追加します。list.append() と異なり、元の配列は変更されないので注意してください。

numpy.append()

In [1]:
import numpy as np

x = np.array([1, 2, 3])
v = [4, 5]
y = np.append(x, v)
print(x)  # 元の配列 x は変更されない
print(y)
[1 2 3]
[1 2 3 4 5]

また、既存の配列に値を追加するのではなく、配列のコピーを作成して追加するため、numpy.appped() をループの中で複数回呼び出すと、処理が遅くなるので注意してください。このような場合は list に追加していき、配列が完成してから numpy.array() で numpy 配列に変換することをおすすめします。

In [2]:
# 駄目なコード例
x = np.empty((0, 1000, 1000))
for i in range(10):
    value = np.random.rand(1, 1000, 1000)
    x = np.append(x, value, axis=0)
In [3]:
# 推奨されるコード例

# list に追加していく。
x = []
for i in range(10):
    value = np.random.rand(1, 1000, 1000)
    x.append(value)
    
# 最後に numpy 配列に変換する。
x = np.array(x)

axis を指定した場合、追加先の配列 arr と値 values の形状は axis 以外の軸は同じでなければなりません。

  • OK: axis=0 の場合に arr.shape: (10, 100, 100)values.shape: (2, 100, 100) を追加する。
  • NG: axis=1 の場合に arr.shape: (10, 100, 10)values.shape: (2, 100, 100) を追加する。

numpy.append()

In [4]:
# 2次元配列
x = np.array([[1, 2], [3, 4]])
v = np.array([[5, 6]])
y = np.append(x, v, axis=0)
print(y)

x = np.array([[1, 2], [3, 4]])
v = np.array([[5], [6]])
y = np.append(x, v, axis=1)
print(y)
[[1 2]
 [3 4]
 [5 6]]
[[1 2 5]
 [3 4 6]]

また、axis を指定しない場合は、arrvalues はともに平坦化 (1次元配列に形状を変更) した上で追加されます。

numpy.append()

In [5]:
# axis を指定しない場合
x = np.array([[1, 2], [3, 4]])
v = np.array([[5, 6], [7, 8]])
y = np.append(x, v)
print(y)
[1 2 3 4 5 6 7 8]

numpy.insert

指定した軸に沿って、指定したインデックスの前に値を挿入します。

numpy.insert(arr, obj, values, axis=None)
引数
名前 デフォルト値
arr array_like
入力配列。
obj int, slice sequence of ints
values が挿入される前のインデックスまたはインデックスを定義するオブジェクト。
values array_like
arr に挿入する値。values の型が arr の型と異なる場合、valuesarr の型に変換されます。values は、arr[…, obj, …] = values という代入ができる形状にする必要があります。
axis int None
values を挿入する軸。axis が None の場合、arr が最初に平坦化されます。
返り値
名前 説明
out values が挿入された arr のコピー。挿入はその場では行われないことに注意してください。新しい配列が確保され、値が設定されます。axis が None の場合、out は平坦化された配列です。

numpy.insert() は、配列のコピーを作成し、指定したインデックスの直前に指定した値を追加します。list.insert() と異なり、元の配列は変更されないので注意してください。

numpy.insert()

In [6]:
import numpy as np

x = np.array([1, 2, 3])
v = [4, 5]
y = np.insert(x, 1, v)  # インデックス=1、つまり、値が2の直前に [4, 5] が挿入される。
print(x)  # 元の配列 x は変更されない
print(y)
[1 2 3]
[1 4 5 2 3]

axis を指定した場合、挿入先の配列 arr と値 values の形状は axis 以外の軸は同じは同じでなければなりません。

  • OK: axis=0 の場合に arr.shape: (10, 100, 100)values.shape: (2, 100, 100) を挿入する。
  • NG: axis=1 の場合に arr.shape: (10, 100, 10)values.shape: (2, 100, 100) を挿入する。

numpy.insert()

In [7]:
# 2次元配列
x = np.array([[1, 2], [3, 4]])
v = np.array([[5, 6]])
y = np.insert(x, 1, v, axis=0)
print(y)

# axis を指定しない場合
x = np.array([[1, 2], [3, 4]])
v = np.array([5, 6])
y = np.insert(x, 1, v)
print(y)
[[1 2]
 [5 6]
 [3 4]]
[1 5 6 2 3 4]

また、axis を指定しない場合は、arr は1次元配列に平坦化した上で挿入されます。

numpy.insert()

numpy.delete

軸に沿って部分配列を削除した新しい配列を返します。1次元配列の場合、これは arr[obj] で返されなかった要素を返します。

numpy.delete(arr, obj, axis=None)
引数
名前 デフォルト値
arr array_like
入力配列。
obj slice, int array of ints
削除する部分配列を指定します。
axis int None
obj で定義された部分配列を削除する軸。axis が None の場合、obj は平坦化された配列に適用されます。
返り値
名前 説明
out obj で指定された要素を削除した arr のコピー。削除はその場では発生しないことに注意してください。axis が None の場合、out は平坦化された配列です。

numpy.delete() は、配列のコピーを作成し、指定したインデックスの値を削除して返します。元の配列は変更されないので注意してください。

numpy.delete()

In [8]:
x = np.array([1, 2, 3, 4, 5])
y = np.delete(x, 1)  # インデックス=1 を削除
print(x)
print(y)

x = np.array([1, 2, 3, 4, 5])
y = np.delete(x, [1, 2])  # インデックス=1, 2 を削除
print(y)
[1 2 3 4 5]
[1 3 4 5]
[1 4 5]

axis を指定した場合、配列 arr の指定した軸のインデックス obj の値を削除します。

numpy.delete()

In [9]:
# 2次元配列
x = np.array([[1, 2], [3, 4], [5, 6]])
y = np.delete(x, 1, axis=0)
print(y)

x = np.array([[1, 2], [3, 4], [5, 6]])
y = np.delete(x, [1, 2], axis=0)
print(y)
[[1 2]
 [5 6]]
[[1 2]]

axis を指定しない場合は、arr は1次元配列に平坦化した上で、インデックス obj の値を削除します。

numpy.delete()

In [10]:
# axis を指定しない場合
x = np.array([[1, 2], [3, 4]])
y = np.delete(x, 1)
print(y)
[1 3 4]

numpy.resize

指定した形状の新しい配列を返します。

numpy.resize(a, new_shape)
引数
名前 デフォルト値
a array_like
リサイズする配列。
new_shape int, tuple of int
リサイズされる配列の形状。
返り値
名前 説明
reshaped_array 新しい配列は、古い配列のデータから形成され、必要な要素数を埋めるために必要に応じて繰り返されます。データはメモリに保存されている順に繰り返されます。

サンプルコード

In [11]:
x = np.array([[1, 2], [3, 4]])
y = np.resize(x, (3, 3))
print(y)
[[1 2 3]
 [4 1 2]
 [3 4 1]]

numpy.resize()

numpy.trim_zeros

1次元配列またはシーケンスから先頭や末尾の 0 を削除します。

numpy.trim_zeros(filt, trim="fb")
引数
名前 デフォルト値
filt 1-D array, sequence
入力配列。
trim str “fb”
“f” の場合、先頭の 0 だけ削除します。”b” の場合、末尾の 0 だけ削除します。デフォルトは “fb” で、配列の両側の 0 を削除します。
返り値
名前 説明
trimmed 入力から 0 を削除した結果。入力データの型は保持されます。

サンプルコード

In [12]:
x = np.array([0, 1, 1, 1, 1, 1, 0, 0])

# 両側の 0 を削除
print(np.trim_zeros(x))

# 先頭の 0 を削除
print(np.trim_zeros(x, "f"))

# 末尾の 0 を削除
print(np.trim_zeros(x, "b"))
[1 1 1 1 1]
[1 1 1 1 1 0 0]
[0 1 1 1 1 1]

numpy.unique

配列のユニークな要素を検索します。

numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)
引数
名前 デフォルト値
ar array_like
入力配列です。axis が指定されていない限り、すでに1次元でなければ平坦化されます。
return_index bool False
Trueの場合、一意な配列になる ar のインデックスも返します。
return_inverse bool False
真の場合、ar を再構成するために使用できる一意な配列のインデックスも返します。
return_counts bool False
真の場合、ar 内の各値の出現回数も返します。
axis int None None
操作する軸。Noneの場合、ar は平坦化されます。整数の場合、指定された軸によってインデックス付けされたサブ配列は平坦化され、指定された軸の次元を持つ1次元配列の要素として扱われます。オブジェクトを含むオブジェクト配列や構造化配列は、axis が使用されている場合はサポートされません。デフォルトは None です。
返り値
名前 説明
unique ソートされた一意の値。
unique_indices 元の配列に含まれる一意の値の最初の出現位置のインデックス。return_index がTrueの場合のみ指定されます。
unique_inverse 一意配列から元の配列を再構築するためのインデックス。return_inverse がTrueの場合にのみ提供されます。
unique_counts 元の配列の中で、それぞれのユニークな値が出てくる回数。return_count がTrueの場合のみ指定されます。

デフォルトでは ar の要素のうち、重複を除いた1次元配列を返します。axis を指定しなかった場合、重複を除く前に平坦化されます。

In [13]:
unique = np.unique([1, 2, 2, 3, 4, 5])
print(unique)

unique = np.unique([[1, 2], [2, 3], [3, 4]])
print(unique)
[1 2 3 4 5]
[1 2 3 4]

axis を指定した場合、その軸に沿って、重複を除いて返します。

In [14]:
unique = np.unique([[1, 2], [1, 2], [2, 4]], axis=0)
print(unique)
[[1 2]
 [2 4]]

unique_indices=True を指定した場合、重複を除いた unique に対応する元の配列のインデックスも返します。

In [15]:
unique, unique_indices = np.unique([1, 2, 2, 3, 4, 3], return_index=True)
print(unique, unique_indices)

unique, unique_indices = np.unique([[1, 2], [2, 2], [4, 3]], return_index=True)
print(unique, unique_indices)
[1 2 3 4] [0 1 3 4]
[1 2 3 4] [0 1 5 4]

unique_inverse=True を指定した場合、元の配列を復元するためのインデックスも返します。

In [16]:
unique, unique_inverse = np.unique([1, 2, 2, 3, 4, 3], return_inverse=True)
print(unique, unique_inverse)
print(unique[unique_inverse])  # 元の配列

unique, unique_inverse = np.unique([[1, 2], [2, 2], [4, 3]], return_inverse=True)
print(unique[unique_inverse])  # 元の配列
[1 2 3 4] [0 1 1 2 3 2]
[1 2 2 3 4 3]
[1 2 2 2 4 3]

unique_counts=True を指定した場合、各値の出現数も返します。

In [17]:
unique, unique_counts = np.unique([1, 2, 2, 3, 4, 3], return_counts=True)
print(unique, unique_counts)

unique, unique_counts = np.unique([[1, 2], [2, 2], [4, 3]], return_counts=True)
print(unique, unique_counts)
[1 2 3 4] [1 2 2 1]
[1 2 3 4] [1 3 1 1]

コメント

コメントする

目次