0Pricing
Python Academy · レッスン

インデックス指定、スライス、高度なインデックス指定

高度なインデックス指定の手法で配列要素にアクセスし、変更します。

「インデックス指定、スライス、高度なインデックス指定」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. NumPy 配列と dtype
  2. 配列演算とブロードキャスト
  3. インデックス指定、スライス、高度なインデックス指定
  4. NumPy による線形代数
← Python Academyに戻る