概要
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 が指定されていない場合、arr と values の両方が追加前に平坦化されます。 |
名前 | 説明 |
---|---|
append | axis に values を追加した arr のコピー。追加は元に配列に対しては行われないことに注意してください。新しい配列が確保され、値が設定されます。axis が None の場合、out は平坦化された配列です。 |
サンプルコード
numpy.append()
は、配列のコピーを作成し、その末尾に指定した値を追加します。list.append()
と異なり、元の配列は変更されないので注意してください。
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 配列に変換することをおすすめします。
# 駄目なコード例
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)
# 推奨されるコード例
# 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)
を追加する。
# 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
を指定しない場合は、arr
と values
はともに平坦化 (1次元配列に形状を変更) した上で追加されます。
# 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 の型と異なる場合、values は arr の型に変換されます。values は、arr[…, obj, …] = values という代入ができる形状にする必要があります。 | ||
axis | int | None |
values を挿入する軸。axis が None の場合、arr が最初に平坦化されます。 |
名前 | 説明 |
---|---|
out | values が挿入された arr のコピー。挿入はその場では行われないことに注意してください。新しい配列が確保され、値が設定されます。axis が None の場合、out は平坦化された配列です。 |
numpy.insert()
は、配列のコピーを作成し、指定したインデックスの直前に指定した値を追加します。list.insert()
と異なり、元の配列は変更されないので注意してください。
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)
を挿入する。
# 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.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()
は、配列のコピーを作成し、指定したインデックスの値を削除して返します。元の配列は変更されないので注意してください。
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
の値を削除します。
# 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
の値を削除します。
# 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 | 新しい配列は、古い配列のデータから形成され、必要な要素数を埋めるために必要に応じて繰り返されます。データはメモリに保存されている順に繰り返されます。 |
サンプルコード
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.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 を削除した結果。入力データの型は保持されます。 |
サンプルコード
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
を指定しなかった場合、重複を除く前に平坦化されます。
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
を指定した場合、その軸に沿って、重複を除いて返します。
unique = np.unique([[1, 2], [1, 2], [2, 4]], axis=0)
print(unique)
[[1 2] [2 4]]
unique_indices=True
を指定した場合、重複を除いた unique
に対応する元の配列のインデックスも返します。
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
を指定した場合、元の配列を復元するためのインデックスも返します。
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
を指定した場合、各値の出現数も返します。
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]
コメント