ついに理解!Python NumPyのファンシーインデックス

最近のクレソン

春が来てクレソン畑がとても素敵になっています!

しばらく体調を崩していましたが、クレソンの成長に負けないように収穫をしなきゃ!

と燃えているヒロアキです。

柔らかくて美味しいクレソンができていますよ!

Python, Numpy, ファンシーインデックス!

プログラミングの勉強、ボチボチ続けています。

なかなかブログの更新ができなかったのが心に引っ掛かっていましたが、

今日は少し学んだことを書いて、わだかまりを解消しようと思います!

今日のテーマは Python NumPy のファンシーインデックス

半年ほど前に調べた時はチンプンカンプンで諦めたんですが、

今回はAI先生に助けてもらいながら、ついに理解できました!🎉

ファンシーインデックスって何?

「ファンシー」って名前が気になってたんですよね。一体どんな機能なんだろう?って。

AI先生によると、

ファンシーインデックスとは、普通のインデックスの代わりに、リストや配列を使って複数の要素に同時にアクセスする方法のこと。

普通のインデックスだと、

x = [10, 20, 30, 40, 50] のリストから x[2]30 を取得するけど、

ファンシーインデックスなら ind = [1, 3, 4] として x[ind][20, 40, 50] を一度に取得できる!

```python
import numpy as np

x = np.array([10, 20, 30, 40, 50])
ind = np.array([1, 3, 4])
print(x[ind])  # 出力: [20 40 50]

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

多次元配列だとどうなるか? これが最初は難しかったんだけど、AI先生のおかげで理解できた!

x = np.arange(12).reshape((3, 4))
print(x)
# 出力:
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

row = np.array([0, 1, 2])
col = np.array([2, 1, 3])
print(x[row, col])  # 出力: [ 2  5 11]

x[row, col] は、row と col の要素をペアにして、x から値を取り出してる。

#  col  0   1   2   3
# row
#   0  [ 0   1   2   3]
#   1  [ 4   5   6   7]
#   2  [ 8   9  10  11]

# x[row, col] -> [x[0, 2], x[1, 1], x[2, 3]] -> [2, 5, 11]

つまづいたところとAI先生による解説

最初は「インデクスの配列を渡す」ってどういうこと?

「複数の配列要素に同時にアクセス」ってどういうこと?って混乱したんだけど、

AI先生が丁寧に解説してくれたおかげで理解できた!

ファンシーインデックスを使うと、複数の要素に同時にアクセスできるから、コードが簡潔になるし、処理速度もアップ! 特に、複雑な条件で要素を抽出したい時にすごく便利! これからは積極的に使っていこうと思う!

まとめ(生成AIによる)

春風駘蕩、クレソン畑はすっかり麗らかになった。しばらく腑抜け同然と化していた私も、そろそろ立ち上がらねば、あの青々としたクレソンに申し訳が立たない。

さて、近頃はPythonの海を彷徨う日々を送っているのだが、先日ついに「ファンシーインデックス」なる奇妙な妖術を解明した。その名からして胡乱な気配が漂うが、要するに、複数の要素を同時に取り出す技のことらしい。

多次元配列となると、途端に脳みそが茹ってしまうのだが、AI先生の懇切丁寧なご指導により、ようやくその奥義を会得した。これで私も、また一歩、深淵なるプログラミングの世界へと足を踏み入れたというわけだ。

追記:今日は”森見登美彦先生風”と指定してみました。なかなかわかっている感じがして悔しいですね。。。