はじめに
この実験では、NumPy のインデックス付けの基本を学びます。インデックス付けにより、配列内の特定の要素や要素のサブセットにアクセスして操作することができます。NumPy の配列を扱う際には、インデックス付けを効果的に使う方法を理解することが重要です。
注:
02-indexing-on-ndarrays.ipynb
でコードを記述できます。手順では一部の出力操作が省略されており、必要に応じて出力を表示できます。
This tutorial is from open-source community. Access the source code
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、NumPy のインデックス付けの基本を学びます。インデックス付けにより、配列内の特定の要素や要素のサブセットにアクセスして操作することができます。NumPy の配列を扱う際には、インデックス付けを効果的に使う方法を理解することが重要です。
注:
02-indexing-on-ndarrays.ipynb
でコードを記述できます。手順では一部の出力操作が省略されており、必要に応じて出力を表示できます。
まず、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 で配列を効果的に操作するために不可欠です。