は、ここで要素のグループのNumPy view
を利用して一つのアプローチだ -
# Taken from https://stackoverflow.com/a/45313353/
def view1D(a, b): # a, b are arrays
a = np.ascontiguousarray(a)
void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
return a.view(void_dt).ravel(), b.view(void_dt).ravel()
def grouped_indices(a, b):
a0v, b0v = view1D(a.reshape(-1,2), b.reshape(-1,2))
sidx = a0v.argsort()
idx = sidx[np.searchsorted(a0v,b0v, sorter=sidx)]
return ((idx*2)[:,None] + [0,1]).ravel()
a
でb
から任意のグループの間にメンバーシップが存在しない場合には、我々はマスク使用してそれを除外することができます:a0v[idx] == b0v
を。
サンプル実行 -
In [345]: a
Out[345]: array([5, 8, 3, 4, 2, 5, 7, 8, 1, 9, 1, 3, 4, 7])
In [346]: b
Out[346]: array([3, 4, 7, 8, 1, 3])
In [347]: grouped_indices(a, b)
Out[347]: array([ 2, 3, 6, 7, 10, 11])
np.searchsorted
交換するnp.in1d
を使用してもう1 - あなたがペアであなたの配列をグループ化しているので
def grouped_indices_v2(a, b):
a0v, b0v = view1D(a.reshape(-1,2), b.reshape(-1,2))
return (np.flatnonzero(np.in1d(a0v, b0v))[:,None]*2 + [0,1]).ravel()
をラヴェル、あなたの答えをありがとうございました。 'inedd'が正しく動作しなかった理由を推測しましたか?' searchsorted'は私が既にチェックした実際のセットで行います。 'b'のすべての要素は' a'に含まれています。ペアになった要素は 'a'と' b'の一意の項目です。 – Tony
@ Tonyおそらく、 'b'のグループ化の順序が' a'の順序と同じではないためです。これは 'array([3、4、7、8、1、3]) 'の代わりに' b'が 'array([1,3,3,4,7,8])'のようなものです。 – Divakar