NumPy

【NumPy】配列(ndarray)の要素を参照する方法

【NumPy】配列(ndarray)の要素を参照する方法
naoki-hn

NumPy の配列(ndarray)の要素を参照する方法を解説します。

配列(ndarray)要素の参照方法

NumPy 配列(ndarray)の要素へのアクセスは、Python のリスト要素にアクセスする方法と同じで、角括弧([])でアクセスをすることができます。

この記事では、NumPy の配列(ndarray)の要素を参照する方法を紹介します。

単一の要素を参照する方法

配列の単一要素にアクセスするには、角括弧([])で要素位置を指定して参照します。

import numpy as np

data = np.arange(10)
print(f'data: {data}')

# 単一の要素にアクセスする(インデックスは0が開始なので注意)
print(f'data[0] = {data[0]}')
print(f'data[5] = {data[5]}')
print(f'data[9] = {data[9]}')
【実行結果】
data: [0 1 2 3 4 5 6 7 8 9]
data[0] = 0
data[5] = 5
data[9] = 9

例では、arange 関数でサイズが 10 の配列を作成して要素を参照しています。インデックスの数字は 0 から開始することに注意しましょう。

スライスで配列の一部を取り出す方法

配列の一部を取り出したい場合には、スライスを使用することで抽出することができます。1 次元配列と 2 次元配列のそれぞれで例を見てみましょう。

1 次元配列の場合

1 次元配列においてスライスで一部を取り出すには、以下のようにします。

import numpy as np

data = np.arange(10)
print(f'data: {data}')

# スライスで要素の一部を取り出す
print('\nスライスで要素の一部を取り出す')
print(f'data[2:8] = {data[2:8]}')
print(f'data[5:] = {data[5:]}')
print(f'data[:5] = {data[:5]}')

# stepを指定して値を取り出す
print('\nstepを指定して一定間隔で値を取り出す')
print(f'data[0:5:2] = {data[0:5:2]}')
print(f'data[::2] = {data[::2]}')

# 逆順で配列を取り出す
print('\n逆順で配列を取り出す')
print(f'data[::-1] = {data[::-1]}')
【実行結果】
data: [0 1 2 3 4 5 6 7 8 9]

スライスで要素の一部を取り出す
data[2:8] = [2 3 4 5 6 7]
data[5:] = [5 6 7 8 9]
data[:5] = [0 1 2 3 4]

stepを指定して一定間隔で値を取り出す
data[0:5:2] = [0 2 4]
data[::2] = [0 2 4 6 8]

逆順で配列を取り出す
data[::-1] = [9 8 7 6 5 4 3 2 1 0]

スライスでは、[start:stop:step] というような記載方法を用います。start 番目から stop-1 番目までを step 刻みで取り出すということを意味します。最後は、stop-1 番目のインデックスとなるため注意してください。なお、startstopstep の各項目は省略が可能です。

例での data[2:8] では、2 番目の要素から 7 番目の要素までになります。また、マイナスの step を指定することもでき、data[::-1] のようにすると逆順の配列を取得することができます。

2 次元配列の場合

2 次元配列の場合も参照方法は、1 次元の場合と変わりません。以下のように、各次元ごとそれぞれで対象範囲を指定します。

import numpy as np

data = np.arange(25).reshape((5, 5))
print(f'data: \n{data}')

# 部分配列を取り出す
print('\n部分配列を取り出す')
print(f'data[:2, :2] = \n{data[:2, :2]}')
print(f'data[3:, 3:] = \n{data[3:, 3:]}')

# stepを指定して部分配列を取り出す
print('\nstepを指定して部分配列を取り出す')
print(f'data[::2, ::2] = \n{data[::2, ::2]}')
【実行結果】
data: 
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

部分配列を取り出す
data[:2, :2] = 
[[0 1]
 [5 6]]
data[3:, 3:] = 
[[18 19]
 [23 24]]

stepを指定して部分配列を取り出す
data[::2, ::2] = 
[[ 0  2  4]
 [10 12 14]
 [20 22 24]]

例では、5 × 5 の配列を作成し、部分配列を取り出しています。なお、1 次元配列、2 次元配列で例を見ましたが、3 次元以上の n 次元配列となっても考え方は同じです。

行や列を取り出す場合

スライスの考え方を用いると、行や列を抽出することができます。データ分析では一般的に行にサンプル、列に属性といった形でデータを用意するので、行や列について個別に取り出せるようにすることは重要です。

import numpy as np

data = np.arange(25).reshape((5, 5))
print(data)

# 行を取り出す
print('\n行を取り出す')
print(f'data[0, :] = {data[0, :]}')
print(f'data[0] = {data[0]}')

# 列を取り出す
print('\n列を取り出す')
print(f'data[:, 0] = {data[:, 0]}')
【実行結果】
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

行を取り出す
data[0, :] = [0 1 2 3 4]
data[0] = [0 1 2 3 4]

列を取り出す
data[:, 0] = [ 0  5 10 15 20]

行を取り出したいときには data[0, :] のように列方向のインデックスを「:」とします。「:」はすべての要素を意味するので data[0, :] は 0 行目のすべての値を取り出すことを意味します。複数行取り出したい場合は、data[0:2, :] のようにすれば複数行取り出せます。

なお、data[0] のように列方向の要素を記載しない場合は、data[0, :] と同じ結果になります。

列を取り出したい場合も考え方は同様です。data[:, 0] とすると、0 列目のすべての値を取り出すことができます。

配列(ndarray)のスライスはビューであるので注意

ndarray のスライスで取得できる変数は元の配列のビューであるため、値を変更すると元の配列の値も変わります。

元の配列を変更したくない場合は、配列の copy メソッドを使用してコピーを作成してください。Python のリスト (list) のスライスは、コピーであることから違いがあるため混同しないようにしましょう。

ndarraylist のスライスの考え方の違いは「「NumPy配列(ndarray)のスライス」と「Python組み込みのlistのスライス」の違い」を参考にしてください。

その他のアクセス方法:
ファンシーインデックス(Fancy Indexing)

その他の要素へのアクセス方法として、NumPy で特徴的な方法として、ファンシーインデックス(Fancy Indexing)というアクセス方法があります。

ファンシーインデックスでは、「インデックスを指定する配列」を渡すことで対象となる要素を取り出すことができて非常に便利です。

ファンシーインデックスについては「ファンシーインデックス(Fancy Indexing)の基本」で詳しくまとめていますので、参考にしてください。

まとめ

NumPy の配列(ndarray)の要素を参照する方法を解説しました。

ndarray は、Python 組み込みの list のように [] を使用して各要素にアクセスしたり、スライスを使って部分を取り出したりすることができます。ただし、ndarray のスライスはビューとなり、list とは異なる点には注意しましょう。

配列の要素に適切にアクセスできるようになることは、データ分析の基本です。しっかりと使い方を理解するようにしましょう。

ソースコード

上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。

あわせて読みたい
【Python Tech】プログラミングガイド
【Python Tech】プログラミングガイド
ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。 私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

プログラミング言語はこれまでC、C++、JAVA等を扱ってきましたが、最近では特に機械学習等の分析でも注目されているPythonについてとても興味をもって取り組んでいます。これまでの経験をもとに、Pythonに興味を持つ方のお役に立てるような情報を発信していきたいと思います。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました