2016-10-26 7 views
1

Предположим, у меня есть массив A формы (M, K) и еще B формы (N, K).Получить строки первого массива, соответствующие рядам второго

Строки B - все возможные шаблоны, которые могут быть обнаружены (каждый шаблон, таким образом, является 1D-массивом размера K).

Я хотел бы, таким образом, чтобы получить массив C в форме (M,), где C[i] является Indice узора (в B) из строки i в A.

Я сейчас делаю это в цикле (то есть цикл по всем возможным моделям), но я бы в конечном итоге с помощью векторизации.

Вот пример:

A = np.array([[0, 1], [0, 1], [1, 0]]) 
B = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) 

Я ожидаю:

C = np.array([1, 1, 2]) 

ответ

1

на основе this solution, вот Векторизованное решение с использованием np.searchsorted -

dims = B.max(0)+1 
A1D = np.ravel_multi_index(A.T,dims) 
B1D = np.ravel_multi_index(B.T,dims) 
sidx = B1D.argsort() 
out = sidx[np.searchsorted(B1D,A1D,sorter=sidx)] 

Sample пробега -

In [43]: A 
Out[43]: 
array([[72, 89, 75], 
     [72, 89, 75], 
     [93, 38, 61], 
     [47, 67, 50], 
     [47, 67, 50], 
     [93, 38, 61], 
     [72, 89, 75]]) 

In [44]: B 
Out[44]: 
array([[47, 67, 50], 
     [93, 38, 61], 
     [41, 55, 27], 
     [72, 89, 75]]) 

In [45]: out 
Out[45]: array([3, 3, 1, 0, 0, 1, 3])