インデックス指定、スライス、高度なインデックス指定
高度なインデックス指定の手法で配列要素にアクセスし、変更します。
「インデックス指定、スライス、高度なインデックス指定」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。
基本インデックス参照
要素には0始まりの整数インデックスでアクセスします。負のインデックスは末尾から数えます。多次元配列では、カンマ区切りのインデックスを使います。
import numpy as np
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr[0, 2]) # 3
print(arr[-1, -1]) # 9
print(arr[1]) # [4 5 6]スライス
スライス構文start:stop:stepはビューを返します。各次元に対して独立に適用されます。
import numpy as np
m = np.arange(16).reshape(4,4)
print(m[1:3, 1:3])
# [[5 6]
# [9 10]]
print(m[::2, ::2]) # every other row and columnブールインデックス参照(マスキング)
同じShapeのブール配列を渡すと、値がTrueの要素を選択できます。
import numpy as np
arr = np.array([1, -2, 3, -4, 5])
mask = arr > 0
print(mask) # [ True False True False True]
print(arr[mask]) # [1 3 5]
arr[~mask] = 0 # set negatives to 0
print(arr) # [1 0 3 0 5]整数配列によるファンシーインデックス参照
整数インデックスの配列を渡すと、複数の特定要素を選択できます。
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
idx = np.array([0, 2, 4])
print(arr[idx]) # [10 30 50]
# 2-D fancy indexing:
m = np.arange(9).reshape(3,3)
print(m[[0,2], [0,2]]) # [m[0,0], m[2,2]] = [0, 8]インデックス選択のためのnp.where
np.where(condition)(引数が1つの場合)は、条件がTrueとなる位置のインデックスを返します。
import numpy as np
arr = np.array([5, 2, 8, 1, 9])
idx = np.where(arr > 4)[0]
print(idx) # [0 2 4]
print(arr[idx]) # [5 8 9]np.takeとnp.put
np.take(arr, indices)は要素を選択します(フラットなインデックス参照に対応しています)。np.put(arr, indices, values)は値を挿入します。
import numpy as np
arr = np.array([10, 20, 30, 40])
print(np.take(arr, [1, 3])) # [20 40]
np.put(arr, [0, 2], [99, 88])
print(arr) # [99 20 88 40]np.nonzero
np.nonzero(arr)は、次元ごとに1つずつ配列を含むタプルを返します。各配列には、0以外の要素のインデックスが格納されます。
import numpy as np
arr = np.array([[0,1,0],[2,0,3]])
rows, cols = np.nonzero(arr)
print(rows, cols) # [0 1 1] [1 0 2]省略記号によるインデックス参照
...(Ellipsis)は、残りの次元をすべてカバーするために必要な数の:に展開されます。
import numpy as np
arr = np.ones((2,3,4,5))
print(arr[0, ..., 2].shape) # (3, 4) — first dim=0, last dim=2
print(arr[..., 0].shape) # (2, 3, 4) — last dim=0外積形式のインデックス参照のためのnp.ix_
np.ix_は、複数の1次元シーケンスから、外積形式のファンシーインデックス参照に使うオープンメッシュを構築します。
import numpy as np
m = np.arange(25).reshape(5,5)
rows = [0, 2, 4]
cols = [1, 3]
print(m[np.ix_(rows, cols)])
# [[ 1 3]
# [11 13]
# [21 23]]ファンシーインデックスへの代入
ファンシーインデックスで選択した要素には、インプレースで代入できます。
import numpy as np
arr = np.zeros(5)
arr[[1, 3]] = [10, 20]
print(arr) # [ 0. 10. 0. 20. 0.]
# Broadcast a scalar:
arr[[0, 2, 4]] = 99
print(arr) # [99. 10. 99. 20. 99.]インデックス参照におけるビューとコピーの違い
基本インデックス参照/スライス参照 → ビュー(変更すると元の配列も変わります)。ファンシーインデックス参照/ブールインデックス参照 → コピー(変更しても元の配列は変わりません)。
import numpy as np
arr = np.arange(5)
view = arr[1:4] # view
view[0] = 99
print(arr) # [0 99 2 3 4]
copy = arr[[1,2,3]] # fancy → copy
copy[0] = 0
print(arr) # unchanged確認問題
ブールインデックス参照/ファンシーインデックス参照は、ビューとコピーのどちらを返しますか。
まとめ
単一要素には[row, col]を、スライス(ビュー)にはstart:stop:stepを使います。マスキングにはブール配列(コピー)を、ファンシーインデックス参照には整数配列(コピー)を使います。インデックスを取得するにはnp.whereを、外積形式のメッシュにはnp.ix_を使います。
よくある質問
「インデックス指定、スライス、高度なインデックス指定」レッスンは無料ですか?
はい。「インデックス指定、スライス、高度なインデックス指定」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。
「インデックス指定、スライス、高度なインデックス指定」で何を学びますか?
高度なインデックス指定の手法で配列要素にアクセスし、変更します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Python Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「インデックス指定、スライス、高度なインデックス指定」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPython Academyレッスンでコードを書いて実行できますか?
はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- NumPy 配列と dtype
- 配列演算とブロードキャスト
- インデックス指定、スライス、高度なインデックス指定
- NumPy による線形代数