NumPy配列の要素・行・列を自在に操作!抽出と代入の完全ガイド
データ分析や科学技術計算で必須となるNumPy。その核となるNumPy配列(ndarray) を効率的に操作することは、データ処理のパフォーマンスを大きく左右します。この記事では、NumPy配列から特定の要素、行、列を取得(抽出) する方法と、それらの値の代入方法について、初心者にもわかりやすく解説します。
NumPy配列の基本:インデックス参照とスライス
NumPy配列の要素にアクセスする際は、Pythonのリストと同じようにインデックスを使用します。多次元配列の場合は、各次元のインデックスをカンマで区切って指定します。
単一要素の取得と代入
NumPy配列の特定の要素は、対応するインデックスを指定することで取得できます。また、取得した要素に新しい値を代入することも可能です。
import numpy as np
arr = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
# 要素の取得
element = arr[1, 2] # 2行目3列目の要素 (0始まり)
print(f"取得した要素: {element}") # 出力: 60
# 要素の代入
arr[0, 0] = 100 # 1行目1列目の要素を100に
print(f"代入後の配列:\n{arr}")
# 出力:
# [[100, 20, 30],
# [ 40, 50, 60],
# [ 70, 80, 90]]
スライスによる複数要素(部分配列)の取得と代入
スライスを使うと、配列の一部を範囲指定して抽出できます。Pythonのリストと同様に開始:終了:ステップの形式で指定します。終了インデックスは含まれません。
import numpy as np
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
# 1行目のすべての要素を取得
row = arr[0, :]
print(f"1行目: {row}") # 出力: [1 2 3 4]
# 2列目のすべての要素を取得
col = arr[:, 1]
print(f"2列目: {col}") # 出力: [ 2 6 10]
# 部分配列の取得
sub_arr = arr[0:2, 1:3] # 1,2行目と2,3列目の交差部分
print(f"部分配列:\n{sub_arr}")
# 出力:
# [[2 3]
# [6 7]]
# 部分配列への代入
arr[1:3, 0:2] = [[99, 88], [77, 66]]
print(f"代入後の配列:\n{arr}")
# 出力:
# [[ 1, 2, 3, 4],
# [99, 88, 7, 8],
# [77, 66, 11, 12]]
条件による要素の取得と代入:ブールインデックス参照
NumPyの強力な機能の一つが、ブールインデックス参照(Boolean Indexing) です。これは、条件式の結果がTrue/Falseのブール配列を使って、条件に一致する要素のみを取得したり、代入したりする方法です。
条件に合致する要素の取得
import numpy as np
arr = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
# 50より大きい要素を取得
greater_than_50 = arr[arr > 50]
print(f"50より大きい要素: {greater_than_50}") # 出力: [60 70 80 90]
条件に合致する要素への代入
ブールインデックス参照は、特定の条件を満たす要素を一括で変更したい場合に非常に便利です。
import numpy as np
arr = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
# 50より大きい要素を0に
arr[arr > 50] = 0
print(f"代入後の配列:\n{arr}")
# 出力:
# [[10 20 30]
# [40 50 0]
# [ 0 0 0]]
高度なインデックス参照:整数配列による指定
整数配列インデックス参照は、特定のインデックスをリストや配列で指定して、要素を抽出する方法です。これにより、連続していない、あるいは重複するインデックスの要素を取得できます。
特定の行・列の取得
import numpy as np
arr = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
# 0番目と2番目の行を取得
rows = arr[[0, 2]]
print(f"0番目と2番目の行:\n{rows}")
# 出力:
# [[10 20 30]
# [70 80 90]]
# 1番目と2番目の列を取得
cols = arr[:, [1, 2]]
print(f"1番目と2番目の列:\n{cols}")
# 出力:
# [[20 30]
# [50 60]
# [80 90]]
不規則な要素の取得と代入
各次元に対して個別のインデックス配列を指定することで、不規則な位置にある要素をまとめて取得・代入できます。
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# (0,0), (1,2), (2,1) の要素を取得
elements = arr[[0, 1, 2], [0, 2, 1]]
print(f"不規則な要素: {elements}") # 出力: [1 6 8]
# これらの要素に新しい値を代入
arr[[0, 1, 2], [0, 2, 1]] = [100, 200, 300]
print(f"代入後の配列:\n{arr}")
# 出力:
# [[100 2 3]
# [ 4 5 200]
# [ 7 300 9]]
まとめ
NumPy配列からの要素、行、列の抽出と代入は、データハンドリングの基本中の基本です。インデックス参照、スライス、ブールインデックス参照、そして高度な整数配列インデックス参照を使いこなすことで、複雑なデータ操作も効率的に行えます。これらのテクニックをマスターして、NumPyでのデータ処理をさらにスムーズにしましょう!

