【Pythonデータ分析】NumPy配列のスライス

NumPy配列ndarrayのスライスは、Python標準のリストlistのスライスと比較して、いくつかの点でデータ分析に適しています。主なメリットとして、1.元の配列のビューを返すこと、2.多次元配列のスライスが容易なこと、3.ブールインデックスが利用可能なことが挙げられます。以下で詳しく説明します。

The N-dimensional array (ndarray) — NumPy v2.2 Manual

NumPy配列ndarrayPython標準の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は、大規模かつ複雑なデータ処理を伴うデータ分析において、強力なツールとなります。