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]
多次元配列の場合
NumPy
のndarray
から要素を取り出す場合の指定方法です。
:
は「全て」または「範囲全体」を表す,
は次元を区切るためのもの
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]]