どうもニコイチです。本記事では、NumPy配列のスライス(部分的に要素を取り出す操作)について詳しく解説します。スライスを活用すると、大きなデータから必要な部分だけを取り出したり、データを効率的に操作したりすることが可能になります。
本記事で学ぶ内容
- インデックスを使った要素の取得
- 一次元配列のスライス
- 二次元配列のスライス
- 条件を使った要素の抽出
- 配列のソート
NumPyのスライスをマスターすると、データ分析や機械学習に役立つスキルが身につきます。では、実際にNumPyを使って配列のスライスを学んでいきましょう!
インデックスを使った要素の取得
NumPyの配列(ndarray)では、リストと同じようにインデックス(添え字)を使って特定の要素を取得できます。ここでは、一次元配列と二次元配列におけるインデックス参照の基本を学びます。
一次元配列のインデックス参照
まずは、一次元配列(1D配列)でのインデックスの使い方を見てみましょう。
import numpy as np
# 一次元配列の作成
arr = np.array([10, 20, 30, 40, 50])
# インデックスを指定して要素を取得
print(arr[0]) # 先頭の要素(10)
print(arr[2]) # 3番目の要素(30)
print(arr[-1]) # 最後の要素(50)
ポイント
- インデックスは 0から始まる ことに注意
- 負のインデックスを使うと、後ろから要素を取得できる(
arr[-1]
は最後の要素)
二次元配列のインデックス参照
次に、二次元配列(2D配列)の場合を見てみましょう。
import numpy as np
# 二次元配列の作成
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 特定の要素を取得
print(arr[1, 1]) # 2行2列目の要素(5)
print(arr[0, 2]) # 1行3列目の要素(3)
ポイント
arr[行番号, 列番号]
の形式で要素を取得できる- Pythonのリストでは
arr[1][1]
のように書くが、NumPyではarr[1, 1]
とカンマを使うのが推奨
実践課題
次の配列を使って、以下の問題を解いてみましょう。
import numpy as np
# 配列の作成
arr = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
# (1) 1行目のすべての要素を取得
print(arr[0])
# (2) 2行目3列目の要素を取得
print(arr[1, 2])
【解答】
[10 20 30]
60
【解説】
arr[0]
を指定すると、1行目全体([10, 20, 30]
)が取得できるarr[1, 2]
で、2行目(インデックス1)の3列目(インデックス2)の要素60
を取得
一次元配列のスライス
前章では、インデックスを使って特定の要素を取得する方法を学びました。ここでは、スライス(部分的に要素を取り出す操作)を使って、複数の要素を取得する方法を学びます。
スライスの基本構文
NumPyの配列では、リストと同様にスライスを使って要素を取り出すことができます。
基本的なスライスの構文
配列[開始インデックス:終了インデックス:ステップ]
開始インデックス
:取得を開始する位置(省略すると0から)終了インデックス
:取得を終了する位置(この値は含まれない)ステップ
:何個飛ばしで取得するか(省略すると1)
具体的なスライスの例
import numpy as np
# 一次元配列の作成
arr = np.array([10, 20, 30, 40, 50, 60])
# (1) 2番目から4番目の要素を取得
print(arr[1:4]) # [20 30 40]
# (2) 最初の3つの要素を取得
print(arr[:3]) # [10 20 30]
# (3) 3番目以降の要素を取得
print(arr[2:]) # [30 40 50 60]
# (4) すべての要素を取得(コピーを作成)
print(arr[:]) # [10 20 30 40 50 60]
# (5) 1つおきに要素を取得
print(arr[::2]) # [10 30 50]
# (6) 逆順に並べる
print(arr[::-1]) # [60 50 40 30 20 10]
ポイント
arr[1:4]
では、1
から3
(4の手前)までの要素が取得できるarr[:3]
のように開始インデックスを省略すると、0から開始arr[2:]
のように終了インデックスを省略すると、最後まで取得arr[::2]
のようにステップを指定すると、1つおきに取得arr[::-1]
で配列を逆順にできる
実践課題
以下の配列を使用して、問題を解いてみましょう。
import numpy as np
# 配列の作成
arr = np.array([5, 10, 15, 20, 25, 30, 35])
# (1) 最初の4つの要素を取得
print(arr[:4])
# (2) 2番目から5番目の要素を取得
print(arr[1:5])
# (3) 1つおきに要素を取得
print(arr[::2])
# (4) 配列を逆順に並べる
print(arr[::-1])
【解答】
[ 5 10 15 20]
[10 15 20 25]
[ 5 15 25 35]
[35 30 25 20 15 10 5]
【解説】
arr[:4]
で最初の4つの要素[5, 10, 15, 20]
を取得arr[1:5]
で 2番目(10)から5番目(25)までの要素を取得arr[::2]
で1つおきの要素[5, 15, 25, 35]
を取得arr[::-1]
で配列を逆順にする
二次元配列のスライス
前章では、一次元配列のスライスを学びました。ここでは、二次元配列(行列)のスライスを学びます。二次元配列では、「行」と「列」の範囲を指定して部分的にデータを取得できます。
二次元配列のスライスの基本
NumPyの二次元配列では、次の構文を使ってスライスを行います。
配列[行の開始インデックス:行の終了インデックス, 列の開始インデックス:列の終了インデックス]
行の開始インデックス
:取得を開始する行(省略すると0から)行の終了インデックス
:取得を終了する行(この行は含まれない)列の開始インデックス
:取得を開始する列(省略すると0から)列の終了インデックス
:取得を終了する列(この列は含まれない)
具体的なスライスの例
import numpy as np
# 二次元配列の作成
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
# (1) 1〜2行目の全列を取得
print(arr[0:2, :])
# (2) 2〜4行目の2〜3列目を取得
print(arr[1:4, 1:3])
# (3) すべての行の2列目を取得
print(arr[:, 1])
# (4) 2行目のすべての列を取得
print(arr[1, :])
# (5) すべての行と列を1つおきに取得
print(arr[::2, ::2])
出力結果
[[1 2 3 4]
[5 6 7 8]]
[[ 6 7]
[10 11]
[14 15]]
[ 2 6 10 14]
[5 6 7 8]
[[ 1 3]
[ 9 11]]
ポイント
arr[0:2, :]
で 1〜2行目の全列 を取得arr[1:4, 1:3]
で 2〜4行目の2〜3列目 を取得arr[:, 1]
で すべての行の2列目 を取得(:
を使うとすべての行を指定)arr[1, :]
で 2行目のすべての列 を取得arr[::2, ::2]
で すべての行と列を1つおきに取得(奇数番目の行・列)
実践課題
以下の配列を使って、次の問題を解いてみましょう。
import numpy as np
# 配列の作成
arr = np.array([[10, 20, 30, 40],
[50, 60, 70, 80],
[90, 100, 110, 120],
[130, 140, 150, 160]])
# (1) 2〜4行目の3〜4列目を取得
print(arr[1:4, 2:4])
# (2) すべての行の2列目を取得
print(arr[:, 1])
# (3) 3行目の全列を取得
print(arr[2, :])
# (4) すべての行と列を1つおきに取得
print(arr[::2, ::2])
【解答】
[[ 70 80]
[110 120]
[150 160]]
[ 20 60 100 140]
[ 90 100 110 120]
[[ 10 30]
[ 90 110]]
【解説】
arr[1:4, 2:4]
で 2〜4行目の3〜4列目 を取得arr[:, 1]
で すべての行の2列目 を取得arr[2, :]
で 3行目の全列 を取得arr[::2, ::2]
で すべての行と列を1つおきに取得
条件を使った要素の抽出
これまで学んだスライスでは、インデックスを指定して要素を取得しました。しかし、NumPyでは 条件を指定して、特定の値を抽出すること も可能です。これにより、データのフィルタリングや統計分析を簡単に行うことができます。
条件付き抽出の基本
NumPyでは、比較演算子を使って配列から条件に合う要素を取り出すことができます。
基本構文
配列[配列 比較演算子 条件値]
配列
:対象となるNumPy配列比較演算子
:<
、>
、<=
、>=
、==
、!=
など条件値
:抽出する基準となる値
具体的な条件付き抽出の例
import numpy as np
# 配列の作成
arr = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
# (1) 50以上の要素を抽出
print(arr[arr >= 50])
# (2) 30未満の要素を抽出
print(arr[arr < 30])
# (3) 40と等しい要素を抽出
print(arr[arr == 40])
# (4) 60以上80以下の要素を抽出
print(arr[(arr >= 60) & (arr <= 80)])
# (5) 30または90の要素を抽出
print(arr[(arr == 30) | (arr == 90)])
出力結果
[50 60 70 80 90]
[10 20]
[40]
[60 70 80]
[30 90]
ポイント
arr[arr >= 50]
で 50以上の要素 を抽出arr[arr < 30]
で 30未満の要素 を抽出arr[arr == 40]
で 40と等しい要素 を抽出arr[(arr >= 60) & (arr <= 80)]
で 60以上80以下の要素 を抽出(&
を使う)arr[(arr == 30) | (arr == 90)]
で 30または90の要素 を抽出(|
を使う)
実践課題
以下の配列を使って、次の問題を解いてみましょう。
import numpy as np
# 配列の作成
arr = np.array([[5000, 20000, 35000],
[45000, 60000, 75000],
[90000, 120000, 150000]])
# (1) 50000未満の値を抽出
print(arr[arr < 50000])
# (2) 30000以上100000以下の値を抽出
print(arr[(arr >= 30000) & (arr <= 100000)])
# (3) 75000または150000の値を抽出
print(arr[(arr == 75000) | (arr == 150000)])
【解答】
[ 5000 20000 35000 45000]
[ 35000 45000 60000 75000 90000]
[ 75000 150000]
【解説】
arr[arr < 50000]
で 50000未満の値 を抽出arr[(arr >= 30000) & (arr <= 100000)]
で 30000以上100000以下の値 を抽出arr[(arr == 75000) | (arr == 150000)]
で 75000または150000の値 を抽出
配列のソート
データを整理する際に、値を昇順や降順に並べ替えることはよくあります。NumPyでは sort()
関数を使うことで、簡単に配列をソートできます。ここでは、一次元配列と二次元配列のソート方法を学びます。
sort()関数の基本
NumPyの sort()
関数は、配列を昇順(小さい順)に並べ替えます。
import numpy as np
# 一次元配列の作成
arr = np.array([30, 10, 50, 20, 40])
# 配列を昇順にソート
arr.sort()
print(arr)
出力結果
[10 20 30 40 50]
ポイント
sort()
を使うと、配列が 昇順(小さい順) に並べ替えられるsort()
は元の配列を変更する(破壊的処理)
二次元配列のソート
二次元配列では、行方向・列方向のどちらで並べ替えるかを指定できます。
import numpy as np
# 二次元配列の作成
arr = np.array([[30, 20, 50, 40, 10],
[300, 200, 500, 400, 100],
[3, 2, 5, 4, 1]])
# (1) 列方向(axis=0)でソート
arr.sort(axis=0)
print(arr)
# (2) 行方向(axis=1)でソート
arr.sort(axis=1)
print(arr)
出力結果
[[ 3 2 5 4 1]
[ 30 20 50 40 10]
[300 200 500 400 100]]
[[ 10 20 30 40 50]
[100 200 300 400 500]
[ 1 2 3 4 5]]
ポイント
arr.sort(axis=0)
→ 列方向にソート(各列の値を昇順に並べ替え)arr.sort(axis=1)
→ 行方向にソート(各行の値を昇順に並べ替え)
降順にソートする
NumPyの sort()
はデフォルトで昇順になりますが、降順(大きい順)にしたい場合はスライス [::-1]
を使います。
import numpy as np
# 一次元配列の作成
arr = np.array([30, 10, 50, 20, 40])
# 昇順にソート
arr.sort()
# 降順にソート
arr = arr[::-1]
print(arr)
出力結果
[50 40 30 20 10]
ポイント
sort()
で昇順に並べた後、[::-1]
で 逆順にする- これにより、降順ソートが実現できる
実践課題
以下の配列を使って、次の問題を解いてみましょう。
import numpy as np
# 配列の作成
arr = np.array([[45, 10, 30, 60],
[90, 20, 70, 80],
[25, 55, 40, 35]])
# (1) 1行目の要素を昇順にする
arr_1d = arr[0]
arr_1d.sort()
print(arr_1d)
# (2) 配列を行方向(axis=1)で昇順にソート
arr.sort(axis=1)
print(arr)
# (3) 配列を列方向(axis=0)で昇順にソート
arr.sort(axis=0)
print(arr)
# (4) 1行目を降順にソート
arr_1d = arr[0]
arr_1d = arr_1d[::-1]
print(arr_1d)
【解答】
[10 30 45 60]
[[10 30 45 60]
[20 70 80 90]
[25 35 40 55]]
[[10 30 40 55]
[20 35 45 60]
[25 70 80 90]]
[60 45 30 10]
【解説】
arr_1d.sort()
で 1行目を昇順にソートarr.sort(axis=1)
で 行方向に昇順ソートarr.sort(axis=0)
で 列方向に昇順ソートarr_1d[::-1]
で 降順にソート
まとめ
本記事では、NumPyの配列スライスについて詳しく解説しました。NumPyを使うことで、データを効率的に取得・加工・整理できることが分かりました。
本記事の振り返り
以下に、各章で学んだ内容をまとめます。
章 | 内容 |
---|---|
1. はじめに | NumPyの概要と配列操作の基本 |
2. インデックスを使った要素の取得 | 一次元・二次元配列のインデックス参照方法 |
3. 一次元配列のスライス | 基本的なスライスの方法(開始・終了・ステップ) |
4. 二次元配列のスライス | 行・列を指定して部分的にデータを取得 |
5. 条件を使った要素の抽出 | 比較演算子を使って特定の値を抽出 |
6. 配列のソート | sort() を使った昇順・降順のソート |
NumPyのスライスの重要性
データ分析や機械学習では、データの一部を抽出したり、特定の条件でフィルタリングしたりする場面が頻繁にあります。NumPyのスライス機能を活用すれば、大量のデータを効率よく操作できるため、データ処理のスピードが向上します。
次に学ぶべきこと
NumPyのスライスをマスターしたら、次のステップとして以下の内容を学ぶと、より高度なデータ分析ができるようになります。
✅ NumPyの応用操作
- 配列の結合 (
np.concatenate
) - 形状の変更 (
np.reshape
,np.flatten
) - 転置 (
np.transpose
)
✅ Pandasと組み合わせたデータ分析
pandas.DataFrame
を使ったデータ操作groupby()
を活用したデータ集計
✅ Matplotlibを使ったデータ可視化
matplotlib.pyplot
を使ったグラフ作成
NumPyのスライスを使いこなせると、データ処理のスキルが向上し、データ分析の効率が大幅にアップします。ぜひ、実際に手を動かして試してみてください!
コメント