1

numpy.in1d() 関数に類似したものが必要です。私のタスクは、2 つ以上の配列が持つアイテムのリストを持つことです。たとえば、私は3つの配列を持っています:

a = np.array((1,2,5,6,12))
b = np.array((1,3,7,8,5,14,19))
c = np.array((2,6,9,5,1,22))

結果は [1, 5] になるはずです

最初に np.in1d を使用して他のすべてと比較する純粋なサイクルよりも速い方法はありますか? 配列のいくつかの結合またはいくつかのスマートなサブインデックス?

4

2 に答える 2

2

各リストが一意である場合は、次を試すことができます。

>>> total=np.concatenate((a,b,c))
>>> np.where(np.bincount(total)>2)
(array([1, 5]),)

#Might be faster to do this.
>>>bins=np.bincount(total)
>>>np.arange(bins.shape[0])[bins>2]
array([1, 5])

これらの配列が大きい場合:

>>> tmp=np.concatenate((np.unique(a),np.unique(b),np.unique(c)))
>>> tmp
array([ 1,  2,  5,  6, 12,  1,  3,  5,  7,  8, 14, 19,  1,  2,  5,  6,  9,
       22])

>>> ulist,uindices=np.unique(tmp,return_inverse=True)
>>> ulist
array([ 1,  2,  3,  5,  6,  7,  8,  9, 12, 14, 19, 22])
>>> uindices
array([ 0,  1,  3,  4,  8,  0,  2,  3,  5,  6,  9, 10,  0,  1,  3,  4,  7,
       11])

>>> np.bincount(uindices)
array([3, 2, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1])
>>> ulist[np.bincount(uindices)>2]
array([1, 5])
于 2013-07-20T20:10:02.233 に答える