NumPy配列ndarray
のスライスは、Python標準のリストlist
のスライスと比較して、いくつかの点でデータ分析に適しています。主なメリットとして、1.元の配列のビューを返すこと、2.多次元配列のスライスが容易なこと、3.ブールインデックスが利用可能なことが挙げられます。以下で詳しく説明します。
The N-dimensional array (ndarray) — NumPy v2.2 Manual
NumPy配列ndarray | Python標準のlist | |
スライスの戻り値 | ビュー | 新しいlistオブジェクト |
多次元配列のスライス | 簡潔に書ける | for文が必要 |
ブールインデックス | 利用可能 | 利用不可 |
1. 元の配列のビューを返す
NumPy配列ndarray
のスライスは、元の配列に対する「ビュー(参照)」を返します。これは、list
のスライスが「新しいリストオブジェクト」を作成するのとは対照的です。この特性により、list
のスライスに比べて、メモリ効率が向上し、大規模なデータ処理において特に有効です。
import numpy as np
# ndarrayのスライス
array1 = np.array([1, 2, 3, 4, 5])
array2 = array1[1:4]
print(array1) # [1 2 3 4 5]
print(array2) # [2 3 4]
array2[0] = 9 # 「スライス後のndarray」の要素を変更
print(array1) # [1 9 3 4 5] 元のndarrayも変更される(array2はarray1のビュー)
print(array2) # [9 3 4]
# listのスライス
list1 = [1, 2, 3, 4, 5]
list2 = list1[1:4]
print(list1) # [1, 2, 3, 4, 5]
print(list2) # [2, 3, 4]
list2[0] = 9 # 「スライス後のlist」の要素を変更
print(list1) # [1, 2, 3, 4, 5] 元のlistは変更されない(list2は新しいオブジェクト)
print(list2) # [9, 3, 4]
2. 多次元配列のスライスが容易
2次元以上のNumPy配列ndarray
に対して、行と列を同時に指定して柔軟なスライス操作が可能です。これにより、複雑な多次元データを効率的に処理することが可能です。
# 2次元ndarrayのスライス
array = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(array[0:2, 1:3]) # 簡潔に記述できる
# [[2 3]
# [5 6]]
# 2次元listのスライス
list = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print([row[1:3] for row in list[0:2]]) # リスト内包表記
# [[2, 3], [5, 6]]
3. ブールインデックスが利用可能
ブール配列(True/Falseの配列)を利用することで、特定の条件に合致する要素のみを抽出して参照できます。この機能は、データ分析において条件に基づいたデータ選択を行う際に役立ちます。
array = np.array([1, 2, 3, 4, 5])
bool_array = array > 2 # bool配列を作成
print(bool_array) # [False False True True True]
filtered_array = array[bool_array] # Trueに対応する要素のみを抽出
print(filtered_array) # [3 4 5]
これらの特性から、NumPy配列ndarray
は、大規模かつ複雑なデータ処理を伴うデータ分析において、強力なツールとなります。