Pythonスライスの基本的な使い方

Pythonのスライス(slice)は、シーケンス(リスト、文字列、タプルなど)から一部の要素を選択するための方法です。スライスを使用すると、シーケンス内の指定した範囲の要素を取り出すことができます。

構文

シーケンス[開始インデックス:終了インデックス:ステップ]
  • シーケンス - スライスを適用するシーケンス(リスト、文字列、タプルなど)
  • 開始インデックス - スライスの開始位置を指定する整数。この位置の要素は含まれる
  • 終了インデックス - スライスの終了位置を指定する整数。この位置の要素は含まれない
  • ステップ - シーケンス内の要素を選択するステップ数。省略可能で、デフォルトは1

スライスの使用例

元のシーケンス

my_list = [1, 2, 3, 4, 5, 6, 7]

インデックス1から4までの要素を選択

slice1 = my_list[1:5]
print(slice1) # [2, 3, 4, 5]

インデックス5から最後までの要素を選択

slice2 = my_list[5:]
print(slice2) # [6, 7]

先頭からインデックス4までの要素を選択

slice3 = my_list[:5]
print(slice3) # [1, 2, 3, 4, 5]

全体のリストをコピー

slice4 = my_list[:]
print(slice4) # [1, 2, 3, 4, 5, 6, 7]

インデックス1から最後までの奇数インデックス要素を選択

slice5 = my_list[1::2]
print(slice5) # [2, 4, 6]

リストを逆順にする

slice6 = my_list[::-1]
print(slice6) # [7, 6, 5, 4, 3, 2, 1]

多次元配列の場合

NumPyndarrayから要素を取り出す場合の指定方法です。

  • :は「全て」または「範囲全体」を表す
  • ,は次元を区切るためのもの
import numpy as np

array_2d = np.array([[0,1,2,3,4,5],
                     [10,11,12,13,14,15],
                     [20,21,22,23,24,25]])
slice1 = array_2d[:, 2]
print(len(slice1), slice1)

slice2 = array_2d[:, :2]
print(len(slice2), slice2)
3 [ 2 12 22]
3 [[ 0  1]
 [10 11]
 [20 21]]

[:, 2]は全ての行(第1次元全体)を選択し、列においてはインデックス=2の要素を選択するという意味です。len()で取得できる長さはデータ数です。

[:, :2]は全ての行(第1次元全体)を選択し、列においては先頭から2つ目までの要素を選択するという意味です。len()で取得できる長さは行の数です。

空配列の場合

第2次元の要素が空の場合、次の処理はエラーとなります。

array_2d = np.array([[], [], []])
slice1 = array_2d[:, 2] # エラー

一方、次の記述はエラーとなりません。

slice1 = array_2d[:, :2]
print(len(slice1), slice1)
slice2 = array_2d[:, 2:]
print(len(slice2), slice2)

この時の出力はいずれも次のようになります。データはありませんが、長さは元の行の数になるので注意してください。

3 []

もちろん、第1次元(行)にも範囲は指定できます。

array_2d = np.array([[0,1,2,3,4,5],
                     [10,11,12,13,14,15],
                     [20,21,22,23,24,25]])
slice1 = array_2d[1, 2]
print(slice1)

slice2 = array_2d[:2, :2]
print(len(slice2), slice2)

slice3 = array_2d[:2, 2]
print(len(slice3), slice3)
12
2 [[ 0  1]
 [10 11]]
2 [ 2 12]

行全体の抽出

array_2d = np.array([[0,1,2,3,4,5],
                    [10,11,12,13,14,15],
                    [20,21,22,23,24,25]])
np_line = np_array[1, :]
print(np_line )
[10 11 12 13 14 15]

行から任意の値のリストを抽出

import numpy as np

np_line  = np.array([10, 11, 12, 13, 14, 15])

bool_index = np_line > 13
print(bool_index)
result = np_line[bool_index]
print(result)
[False False False False  True  True]
[14 15]

列の値が任意のセットを抽出

import numpy as np

list1 = [1, 2, 3, 4, 5, 6, 7]
list2 = [100, 200, 300, 400, 500, 600, 700]

# NumPy配列の作成
np_array = np.array([list1, list2]).T
bool_index = np_array[:, 1] % 200 != 0
print(bool_index)
result = np_array[bool_index]
print(result)

NumPy配列.Tは行と列を入れ替えた二次元配列を作成します。

[ True False  True False  True False  True]
[[  1 100]
 [  3 300]
 [  5 500]
 [  7 700]]
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です