2 つの numpy 配列間の交点のインデックスを取得するにはどうすればよいですか? 交差する値を取得できますintersect1d
:
import numpy as np
a = np.array(xrange(11))
b = np.array([2, 7, 10])
inter = np.intersect1d(a, b)
# inter == array([ 2, 7, 10])
しかし、どうすればa
の値のインデックスを取得できますinter
か?
によって生成されたブール配列を使用して、in1d
にインデックスを付けることができますarange
。a
インデックスが値と異なるように反転する:
>>> a[::-1]
array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
>>> a = a[::-1]
intersect1d
それでも同じ値を返します...
>>> numpy.intersect1d(a, b)
array([ 2, 7, 10])
ただしin1d
、ブール配列を返します。
>>> numpy.in1d(a, b)
array([ True, False, False, True, False, False, False, False, True,
False, False], dtype=bool)
範囲にインデックスを付けるために使用できるもの:
>>> numpy.arange(a.shape[0])[numpy.in1d(a, b)]
array([0, 3, 8])
>>> indices = numpy.arange(a.shape[0])[numpy.in1d(a, b)]
>>> a[indices]
array([10, 7, 2])
ただし、上記を単純化するために使用できます-- これは、 , ... 座標nonzero
の均一なリストのタプルを返すため、おそらく最も正しいアプローチです。X
Y
>>> numpy.nonzero(numpy.in1d(a, b))
(array([0, 3, 8]),)
または、同等に:
>>> numpy.in1d(a, b).nonzero()
(array([0, 3, 8]),)
結果は、同じ形状の配列へのインデックスとしてa
問題なく使用できます。
>>> a[numpy.nonzero(numpy.in1d(a, b))]
array([10, 7, 2])
ただし、多くの状況では、ブール配列を非ブール インデックスのセットに変換するのではなく、ブール配列自体を使用する方が理にかなっていることに注意してください。
最後に、boolean 配列を に渡すこともできますargwhere
。これにより、わずかに異なる形状の結果が生成されます。これはインデックス作成には適していませんが、他の目的には役立つ可能性があります。
>>> numpy.argwhere(numpy.in1d(a, b))
array([[0],
[3],
[8]])
intersect1d で指定された一意の値を取得する必要がある場合:
import numpy as np
a = np.array([range(11,21), range(11,21)]).reshape(20)
b = np.array([12, 17, 20])
print(np.intersect1d(a,b))
#unique values
inter = np.in1d(a, b)
print(a[inter])
#you can see these values are not unique
indices=np.array(range(len(a)))[inter]
#These are the non-unique indices
_,unique=np.unique(a[inter], return_index=True)
uniqueIndices=indices[unique]
#this grabs the unique indices
print(uniqueIndices)
print(a[uniqueIndices])
#now they are unique as you would get from np.intersect1d()
出力:
[12 17 20]
[12 17 20 12 17 20]
[1 6 9]
[12 17 20]