NumPy 上級インデックス

NumPy は、一般的な Python シーケンスよりも多くのインデックス方法を提供します。

これまで見てきた整数とスライスによるインデックスに加えて、配列は整数配列インデックス、ブールインデックス、ファンシーインデックスによってインデックス指定できます。

NumPy における上級インデックスとは、整数配列、ブール配列、またはその他のシーケンスを使用して配列の要素にアクセスすることを指します。基本インデックスと比較して、上級インデックスは配列内の任意の要素にアクセスでき、配列に対して複雑な操作や変更を行うために使用できます。

整数配列インデックス

整数配列インデックスとは、ある配列を使用して別の配列の要素にアクセスすることです。この配列の各要素は、ターゲット配列の特定の次元におけるインデックス値です。

次の例では、配列内の(0,0),(1,1)と(2,0)位置にある要素を取得します。

例

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]

次の例では、4X3 配列の四隅の要素を取得します。行インデックスは [0,0] と [3,3]、列インデックスは [0,2] と [0,2] です。

例

import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print ('配列は次のとおりです:' ) print (x) print ('\n') rows = np.array([[0,0],[3,3]]) cols = np.array([[0,2],[0,2]]) y = x[rows,cols] print ('この配列の四隅の要素は次のとおりです:') print (y)

出力結果は次のとおりです:

我们的数组是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


这个数组的四个角元素是:
[[ 0  2]
 [ 9 11]]

返される結果は、各隅の要素を含む ndarray オブジェクトです。

スライスを利用して: 或 …インデックス配列と組み合わせることができます。次の例のとおりです:

例

import numpy as np a = np.array([[1,2,3], [4,5,6],[7,8,9]]) b = a[1:3, 1:3] c = a[1:3,[1,2]] d = a[...,1:] print(b) print(c) print(d)

出力結果は次のとおりです:

[[5 6]
 [8 9]]
[[5 6]
 [8 9]]
[[2 3]
 [5 6]
 [8 9]]

ブールインデックス

ブール配列を使用してターゲット配列をインデックスできます。

ブールインデックスは、ブール演算(比較演算子など)を使用して、指定された条件を満たす要素の配列を取得します。

次の例では、5より大きい要素を取得します:

例

import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print ('配列は次のとおりです:') print (x) print ('\n') # ここで5より大きい要素を出力します print ('5より大きい要素は次のとおりです:') print (x[x > 5])

出力結果は次のとおりです:

我们的数组是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


大于 5 的元素是:
[ 6  7  8  9 10 11]

次の例では、~(補数演算子)を使用して 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.]

次の例では、配列から複素数でない要素をフィルタリングする方法を示します。

例

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]

ファンシーインデックス

ファンシーインデックスとは、整数配列を使用したインデックスを指します。

ファンシーインデックスは、インデックス配列の値をターゲット配列の特定の軸の添え字として使用して値を取得します。

1次元整数配列をインデックスとして使用する場合、ターゲットが1次元配列であれば、インデックスの結果は対応する位置の要素です。ターゲットが2次元配列であれば、対応する添え字の行になります。

ファンシーインデックスはスライスとは異なり、常にデータを新しい配列にコピーします。

1次元配列

1次元配列には軸が1つしかないためaxis = 0、1次元配列はaxis = 0この軸上で値を取得します:

例

import numpy as np

x = np.arange(9)
print(x)
# 1次元配列で指定された添え字に対応する要素を読み取る
print("-------添え字に対応する要素を読み取る-------")
x2 = x[[0, 6]] # ファンシーインデックスを使用
print(x2)

print(x2[0])
print(x2[1])

出力結果は次のとおりです:

[0 1 2 3 4 5 6 7 8]
-------读取下标对应的元素-------
[0 6]
0
6

2次元配列

1、順方向のインデックス配列を渡す

例

import numpy as np x=np.arange(32).reshape((8,4)) print(x) # 2次元配列で指定された添え字に対応する行を読み取る print("-------添え字に対応する行を読み取る-------") print (x[[4,2,1,7]])

print (x[[4,2,1,7]])出力されるのは、添え字4, 2, 1, 7に対応する行で、出力結果は次のとおりです:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
-------读取下标对应的行-------
[[16 17 18 19]
 [ 8  9 10 11]
 [ 4  5  6  7]
 [28 29 30 31]]

2、逆方向のインデックス配列を渡す

例

import numpy as np x=np.arange(32).reshape((8,4)) print (x[[-4,-2,-1,-7]])

出力結果は次のとおりです:

[[16 17 18 19]
 [24 25 26 27]
 [28 29 30 31]
 [ 4  5  6  7]]

3、複数のインデックス配列を渡す(np.ix_ を使用する必要があります)

np.ix_ 関数は、2つの配列を入力として受け取り、デカルト積のマッピング関係を生成します。

デカルト積とは、数学において、2つの集合 X と Y のデカルト積(Cartesian product)のことで、直積とも呼ばれ、次のように表されます:X×Y最初の対象が X のメンバーであり、2番目の対象が Y のメンバーであるすべての可能な順序対のうちの1つです。

例えばA={a,b}, B={0,1,2}、の場合、次のようになります:

A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

例

import numpy as np x=np.arange(32).reshape((8,4)) print (x[np.ix_([1,5,7,2],[0,3,1,2])])

出力結果は次のとおりです:

[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]
その他の拡張