NumPy-高度なインデックス作成

非タプルシーケンスであるndarray、整数またはブールデータ型のndarrayオブジェクト、または少なくとも1つの項目がシーケンスオブジェクトであるタプルから選択することができます。高度なインデックス作成では、常にデータのコピーが返されます。これに対して、スライスはビューを提示するだけです。

高度なインデックス作成には2つのタイプがあります- Integer そして Boolean

整数インデックス

このメカニズムは、N次元インデックスに基づいて配列内の任意のアイテムを選択するのに役立ちます。各整数配列は、その次元へのインデックスの数を表します。インデックスがターゲットのndarrayの次元と同じ数の整数配列で構成されている場合、インデックスは単純になります。

次の例では、ndarrayオブジェクトの各行から指定された列の1つの要素が選択されています。したがって、行インデックスにはすべての行番号が含まれ、列インデックスは選択する要素を指定します。

例1

import numpy as np 

x = np.array([[1, 2], [3, 4], [5, 6]]) 
y = x[[0,1,2], [0,1,0]] 
print y

その出力は次のようになります-

[1  4  5]

選択には、最初の配列の(0,0)、(1,1)、および(2,0)の要素が含まれます。

次の例では、4X3配列のコーナーに配置された要素が選択されています。選択の行インデックスは[0、0]と[3,3]ですが、列インデックスは[0,2]と[0,2]です。

例2

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 
   
print 'Our array is:' 
print x 
print '\n' 

rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols] 
   
print 'The corner elements of this array are:' 
print y

このプログラムの出力は次のとおりです-

Our array is:                                                                 
[[ 0  1  2]                                                                   
 [ 3  4  5]                                                                   
 [ 6  7  8]                                                                   
 [ 9 10 11]]
 
The corner elements of this array are:                                        
[[ 0  2]                                                                      
 [ 9 11]]

結果として選択されるのは、コーナー要素を含むndarrayオブジェクトです。

高度なインデックス作成と基本的なインデックス作成は、1つのスライス(:)または省略記号(…)とインデックス配列を使用して組み合わせることができます。次の例では、行にスライスを使用し、列に高度なインデックスを使用しています。スライスを両方に使用した場合の結果は同じです。ただし、高度なインデックスはコピーになり、メモリレイアウトが異なる場合があります。

例3

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n'  

# slicing 
z = x[1:4,1:3] 

print 'After slicing, our array becomes:' 
print z 
print '\n'  

# using advanced index for column 
y = x[1:4,[1,2]] 

print 'Slicing using advanced index for column:' 
print y

このプログラムの出力は次のようになります-

Our array is:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8]
 [ 9 10 11]]
 
After slicing, our array becomes:
[[ 4  5]
 [ 7  8]
 [10 11]]

Slicing using advanced index for column:
[[ 4  5]
 [ 7  8]
 [10 11]]

ブール配列インデックス

このタイプの高度なインデックス付けは、結果のオブジェクトが比較演算子などのブール演算の結果であることが意図されている場合に使用されます。

例1

この例では、ブールインデックスの結果として5より大きいアイテムが返されます。

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n'  

# Now we will print the items greater than 5 
print 'The items greater than 5 are:' 
print x[x > 5]

このプログラムの出力は次のようになります-

Our array is: 
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8] 
 [ 9 10 11]] 
 
The items greater than 5 are:
[ 6  7  8  9 10 11]

例2

この例では、〜(補数演算子)を使用してNaN(数値ではない)要素を省略しています。

import numpy as np 
a = np.array([np.nan, 1,2,np.nan,3,4,5]) 
print a[~np.isnan(a)]

その出力は次のようになります-

[ 1.   2.   3.   4.   5.]

例3

次の例は、配列から複雑でない要素を除外する方法を示しています。

import numpy as np 
a = np.array([1, 2+6j, 5, 3.5+5j]) 
print a[np.iscomplex(a)]

ここで、出力は次のとおりです。

[2.0+6.j  3.5+5.j]