Pandas & NumPy Academy · レッスン

配列のスライスとインデックス指定

多次元配列に対して整数表記とスライス表記を使い、個々の要素、行、列、部分配列を選択します。

レッスン 4/413 ステップ

「配列のスライスとインデックス指定」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

1次元配列の整数インデックス

1次元配列はリストと同じようにインデックス指定できます。a[0]は最初の要素、a[-1]は最後の要素です。インデックス指定の結果は1つのスカラーになり、負の数は末尾から数えます。

import numpy as np

a = np.array([10, 20, 30, 40, 50])
print(a[0])    # 10
print(a[-1])   # 50
print(a[2])    # 30

1次元配列をスライスする

スライスにはリストと同じようにstart:stop:stepを使いますが、NumPyのスライスはビューを返し、コピーを作りません。スライスを変更すると元の配列も変わるため、必要に応じて.copy()を使ってください。

import numpy as np

a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
print(a[2:7])      # [2 3 4 5 6]
print(a[::2])      # [0 2 4 6 8]
print(a[::-1])     # [9 8 7 6 5 4 3 2 1 0]

2次元配列のインデックス指定

2次元配列では、コンマ構文a[row, col]を使います。単独のコロンはその軸のすべてを意味するため、a[0, :]は行全体を、a[:, 1]は列全体を取得します。

import numpy as np

m = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

print(m[1, 2])     # 6  (row 1, col 2)
print(m[0, :])     # [1 2 3]  first row
print(m[:, 1])     # [2 5 8]  second column

2次元配列をスライスする

2つのスライスを指定すると、長方形のブロックを取得できます。a[0:2, 1:3]は指定した行と列を取り出します。結果はビューなので、変更は元の配列に反映されます。

import numpy as np

m = np.arange(16).reshape(4, 4)
print(m)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]]

print(m[1:3, 1:3])
# [[ 5  6]
#  [ 9 10]]

ブールインデックス

ブール配列を渡すと、Trueが付いた要素だけを残せます。このブールインデックスは必ずコピーを返し、データのフィルタリングに標準的に使われます。

import numpy as np

a = np.array([3, 7, 2, 9, 1, 6])
mask = a > 4
print(mask)     # [False  True False  True False  True]
print(a[mask])  # [7 9 6]

# Equivalent one-liner
print(a[a > 4])  # [7 9 6]

整数配列によるファンシーインデックス

ファンシーインデックスを使うと、整数のリストで任意の位置の要素を選択できます。順序を自由に指定でき、同じ要素を繰り返すこともできます。結果は必ずコピーです。

import numpy as np

a = np.array([10, 20, 30, 40, 50])
idx = [4, 1, 3]
print(a[idx])    # [50 20 40]

# Selecting specific rows from a 2D array
m = np.arange(20).reshape(4, 5)
print(m[[0, 2], :])  # rows 0 and 2

条件選択に使うnp.where

np.where(condition, x, y)は、conditionがTrueの位置ではxから、Falseの位置ではyから値を選びます。ループを使わず要素ごとに値を選べる高速な方法です。

import numpy as np

a = np.array([5, -3, 8, -1, 2])
result = np.where(a > 0, a, 0)  # keep positives, zero negatives
print(result)  # [5 0 8 0 2]

# np.where with one argument returns indices of True elements
idx = np.where(a > 0)
print(idx)     # (array([0, 2, 4]),)

スライスはビュー:注意点

注意してください。スライスはビューなので、スライスを編集すると元の配列も編集されます。独立したデータが必要な場合は、先にスライスへ.copy()を呼び出してください。⚠️

import numpy as np

original = np.arange(6)
view = original[2:5]   # view, not copy
view[:] = 99
print(original)  # [ 0  1 99 99 99  5]  -- original changed!

safe = original[2:5].copy()  # true copy
safe[:] = 0
print(original)  # [ 0  1 99 99 99  5]  -- unchanged

3次元配列のインデックス指定

配列の次元数に制限はありません。3次元配列では、a[depth, row, col]のように3つの位置を指定します。画像のバッチを扱うときによく使われます。

import numpy as np

t = np.arange(24).reshape(2, 3, 4)
print(t.shape)       # (2, 3, 4)
print(t[0, :, :])    # first 'plane' -- shape (3, 4)
print(t[1, 2, 3])    # scalar at depth 1, row 2, col 3

インデックス指定による値の代入

スライス、マスク、ファンシーインデックスなど、どの形式のインデックス指定も=の左辺で使えば、値をその場で変更できます。スカラーを代入すると、NumPyがすべての位置に展開します。

import numpy as np

a = np.zeros(8)
a[2:5] = 1.0          # slice assignment
print(a)  # [0. 0. 1. 1. 1. 0. 0. 0.]

a[a == 0] = -1.0      # boolean assignment
print(a)  # [-1. -1.  1.  1.  1. -1. -1. -1.]

Ellipsisとnp.newaxis

np.newaxis(またはNone)はサイズ1の軸を追加します。(5,)の配列を(5, 1)の列ベクトルに変換でき、ブロードキャストの前準備としてよく使われます。

import numpy as np

t = np.ones((2, 3, 4))
print(t[..., 0].shape)   # (2, 3) -- last axis fixed at 0

a = np.array([1, 2, 3])
print(a.shape)                 # (3,)
print(a[:, np.newaxis].shape)  # (3, 1) column vector

確認問題

このレッスンで学んだNumPy配列のスライスとインデックス指定について、理解度を確認しましょう。

レッスンのまとめ

よくできました!スライスはビューでメモリを共有し、ブールインデックスはフィルタリングしてコピーを作り、ファンシーインデックスは指定した任意の要素を取得します。次はユニバーサル関数です。

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「配列のスライスとインデックス指定」レッスンは無料ですか?

はい。「配列のスライスとインデックス指定」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「配列のスライスとインデックス指定」で何を学びますか?

多次元配列に対して整数表記とスライス表記を使い、個々の要素、行、列、部分配列を選択します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「配列のスライスとインデックス指定」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. NumPy配列の作成
  2. 配列の属性と確認
  3. 要素単位の算術演算
  4. 配列のスライスとインデックス指定
← Pandas & NumPy Academyに戻る