[NumPy] 9. ファンシーインデックス

NumPy

はじめに

NumPyのファンシーインデックスは、整数配列をインデックスとして使用することで、配列から特定の要素を柔軟に抽出できる強力な機能です。通常のスライシングでは連続した要素しか取り出せませんが、ファンシーインデックスを使えば任意の位置にある要素を自由に選択できます。この記事では、ファンシーインデックスの基本的な使い方から応用例まで詳しく解説します。

1次元配列のファンシーインデックス

データの生成

np.linspace()で0〜10の整数をもつ配列を生成します。

インデックスのリストによるアクセス

整数リストをインデックスとして配列に適用することで、そのインデックスに対応する配列要素を効率的に取り出すことができる。

マイナスの整数リストによるアクセス

マイナスの整数を要素とするリストを配列に適用すると、スライスの場合と同様に、最後尾からのインデックスに対応する要素が取得できます。

2次元配列をインデックスとして用いる場合

2次元配列をインデックスとして配列(X)に適用すると、そのインデックス配列と同じ形状の結果配列が得られる。

np.takeによる要素の取得

np.take関数を使用しても、上記と同様の結果を得ることができます。

2次元配列のファンシーインデックス

データの生成

NumPyのnp.arange(16)関数で0から15までの配列を生成し、reshape(4,4)メソッドを使って4行4列の二次元配列に変形しています。

行、列のインデックスを指定

rowに行のインデックス、colに列のインデックスを設定して、[row,col]を配列に適用します。

row=col=[0,1,2,3]であるため、以下のように要素が抽出されます:

  • 1つ目の要素は0行目0列目の0
  • 2つ目の要素は1行目1列目の5
  • 3つ目の要素は2行目2列目の10
  • 4つ目の要素は3行目3列目の15

インデックスにブロードキャストを適用

まず、配列rowに対して[:,np.newaxis]を適用することで、形状が(4,1)の配列を得ることができます。

インデックスに[(1,4),(4,1)]の形状のものを指定すると、インデックスがブロードキャストされます。その結果、返される配列の形状は(4,4)になります。

ブロードキャストについては下記で詳しく説明しています。

[NumPy] 7. ブロードキャスト
NumPyのブロードキャスト機能について視覚的に解説した記事。異なる形状の配列間での演算を可能にするこの機能の仕組みや活用法を、ボクセルグラフを用いて分かりやすく説明しています。NumPyの基本を理解した後のステップアップに最適な内容です。

まとめ

ファンシーインデックスは、NumPyの強力な機能の一つで、整数配列をインデックスとして使うことで配列から特定の要素を自由に取り出すことができます。基本的な一次元配列での使用から、多次元配列での応用、ブール配列との組み合わせまで、様々な場面で活用できます。特にデータ分析や科学計算において、特定の条件を満たす要素だけを抽出したい場合に非常に便利です。この機能を使いこなすことで、NumPyでのデータ処理の幅が大きく広がるでしょう。

参考

Numpyのファンシーインデックス(Fancy Index)で配列を自由に操作する - Qiita
やりたいこと Numpyのndarrayに備え付けられているファンシーインデックスという機能を使ってリストより自由に配列を操作してみる 環境 Python3.6.3 Linux Mint MATE 18 ファンシーインデックスとは何か 文章...
https://numpy.org/doc/stable/reference/arrays.indexing.html

コメント