NumPy におけるインデックス付けの入門

NumPyNumPyBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、NumPy のインデックス付けの基本を学びます。インデックス付けにより、配列内の特定の要素や要素のサブセットにアクセスして操作することができます。NumPy の配列を扱う際には、インデックス付けを効果的に使う方法を理解することが重要です。

注: 02-indexing-on-ndarrays.ipynb でコードを記述できます。手順では一部の出力操作が省略されており、必要に応じて出力を表示できます。

NumPy のインポート

まず、NumPy ライブラリをインポートして、その関数やデータ型を使用できるようにしましょう。

import numpy as np

基本的なインデックス付け

NumPy 配列は、標準的な Python 構文 x[obj] を使ってインデックス付けできます。ここで x は配列で、obj は選択条件です。obj の種類に応じて、さまざまな種類のインデックス付けが利用できます。

単一要素のインデックス付け

単一要素のインデックス付けは、他の標準的な Python シーケンスのインデックス付けとまったく同じように機能します。0 から始まり、配列の末尾からのインデックス付けには負のインデックスを受け付けます。

x = np.arange(10)
print(x[2])  ## 出力: 2
print(x[-2])  ## 出力: 8

多次元のインデックス付け

配列は多次元であることができ、各次元に対してインデックス付けの仕方は同じです。多次元配列の要素にアクセスするには、各次元のインデックスをカンマで区切ります。

x = np.arange(10).reshape(2, 5)
print(x[1, 3])  ## 出力: 8
print(x[1, -1])  ## 出力: 9

部分次元配列のインデックス付け

多次元配列を、次元数よりも少ないインデックスでインデックス付けると、部分次元配列が得られます。指定された各インデックスは、選択された残りの次元に対応する配列を選択します。

x = np.arange(10).reshape(2, 5)
print(x[0])  ## 出力: [0, 1, 2, 3, 4]

スライシングとストライド

NumPy の基本的なスライシングは、Python のスライシング概念を N 次元に拡張します。これにより、配列の各次元に沿った要素の範囲を選択できます。

基本的なスライシング

基本的なスライシングは、obj がスライスオブジェクト(角括弧内の start:stop:step 表記で構築)、整数、またはスライスオブジェクトと整数のタプルの場合に発生します。

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

負のインデックス

負のインデックスを使って、配列の末尾からインデックス付けすることができます。たとえば、-1 は最後の要素を指し、-2 は 2 番目に最後の要素を指し、それ以外も同様です。

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

スライシングのデフォルト値

開始インデックスが指定されていない場合、正のステップ値の場合は 0 がデフォルト値となり、負のステップ値の場合は -n-1 がデフォルト値となります。終了インデックスが指定されていない場合、正のステップ値の場合は n がデフォルト値となり、負のステップ値の場合は -n-1 がデフォルト値となります。ステップが指定されていない場合、1 がデフォルト値となります。

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

高度なインデックス付け

選択オブジェクト obj がタプルでないシーケンスオブジェクト、ndarray(データ型整数またはブール型)、または少なくとも 1 つのシーケンスオブジェクトまたは ndarray(データ型整数またはブール型)を含むタプルの場合、高度なインデックス付けがトリガーされます。高度なインデックス付けには 2 種類あります。整数型とブール型。

整数配列インデックス付け

整数配列インデックス付けにより、配列内の任意の要素をその N 次元インデックスに基づいて選択できます。各整数配列は、その次元へのインデックスの数を表します。

x = np.arange(10, 1, -1)
print(x[np.array([3, 3, 1, 8])])  ## 出力: [7, 7, 9, 2]
print(x[np.array([3, 3, -3, 8])])  ## 出力: [7, 7, 4, 2]

ブール配列インデックス付け

ブール配列インデックス付けにより、ブール条件に基づいて配列要素を選択できます。結果は、ブール配列の True 値に対応する要素のみを含む新しい配列になります。

x = np.array([1., -1., -2., 3])
x[x < 0] += 20
print(x)  ## 出力: [ 1., 19., 18., 3.]

フィールドアクセス

ndarray オブジェクトが構造体配列の場合、配列のフィールドには、辞書のように文字列を使って配列をインデックス付けすることでアクセスできます。

x = np.array([(1, 2), (3, 4), (5, 6)], dtype=[('a', np.int32), ('b', np.int32)])
print(x['a'])  ## 出力: [1, 3, 5]

フラットイテレータのインデックス付け

x.flat 属性は、C 連続スタイルで配列全体を反復処理するために使用できるイテレータを返します。このイテレータも基本的なスライシングまたは高度なインデックス付けを使用してインデックス付けできます。

x = np.arange(10)
iterator = x.flat
print(iterator[1:5])  ## 出力: [1, 2, 3, 4]

インデックス付けされた配列に値を割り当てる

インデックス付けを使用して、配列内の特定の要素または要素のサブセットに値を割り当てることができます。割り当てられる値は、インデックス付けされた配列と形状が一致している必要があります。

x = np.arange(10)
x[2:7] = 1
print(x)  ## 出力: [0, 1, 1, 1, 1, 1, 7, 8, 9]

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

まとめ

この実験では、NumPy のインデックス付けの基本を学びました。基本的なインデックス付け、スライシング、高度なインデックス付け、フィールドアクセス、フラットイテレータのインデックス付け、およびインデックス付けされた配列に値を割り当てる方法を学びました。これらのインデックス付け技術を理解することは、NumPy で配列を効果的に操作するために不可欠です。