10章ファンシーインデクス

これまでに、単純なインデクス(例えばarr[0])、スライス(例えばarr[:5])、ブール値マスク(例えばarr[arr > 0])を使用して配列の一部にアクセスし、その内容を変更する方法を見てきました。ここでは、ファンシーインデクスまたはベクトル化インデクスと呼ばれる配列インデクスを紹介します。ファンシーインデクスはすでに紹介した単純なインデクスのようにも見えますが、単一のスカラー値の代わりにインデクスの配列を渡します。これにより、配列の複雑なサブセットへの迅速なアクセスと内容の変更が可能となります。

10.1 ファンシーインデクスの探求

ファンシーインデクスの概念は単純です。インデクスの配列を渡して、複数の配列要素に同時にアクセスします。例えば、次の配列で考えてみましょう。

In [1]: import numpy as np
        rng = np.random.default_rng(seed=1701)

        x = rng.integers(100, size=10)
        print(x)
Out[1]: [90 40  9 30 80 67 39 15 33 79]

この中の3つの要素にアクセスしたい場合、おそらく次の方法を使います。

In [2]: [x[3], x[7], x[2]]
Out[2]: [30, 15, 9]

インデクスのリストまたは配列を渡しても、同じ結果が得られます。

In [3]: ind = [3, 7, 4]
        x[ind]
Out[3]: array([30, 15, 80])

ファンシーインデクスを使用すると、その結果の形状は元の配列の形状ではなく、インデクス配列の形状となります。

In [4]: ind ...

Get Pythonデータサイエンスハンドブック 第2版 ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.