42

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か?

4

4 に答える 4

45

によって生成されたブール配列を使用して、in1dにインデックスを付けることができますarangeaインデックスが値と異なるように反転する:

>>> 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の均一なリストのタプルを返すため、おそらく最も正しいアプローチです。XY

>>> 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]])
于 2012-07-14T12:59:00.947 に答える
2

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]
于 2016-09-20T21:47:46.527 に答える