2016-02-26 4 views
2

Я пытаюсь использовать функцию intersect1d с представлением на 2D-массиве, чтобы найти пересечение его первого столбца с другим 1D-массивом, сохраняя его второй столбец в конечном результате. Однако я застрял, пытаясь построить представление.Python Numpy intersect1d на массиве 1D с 2D-массивом

Пример входных данных:

a1 = np.array([[1,2],[3,4],[4,9]], dtype=np.uint32) 
a2 = np.array([8,3,8,1,0,9,3,2], dtype=np.uint32) 

Желаемый результат:

[[1,2],[3,4]] 
+0

Документация [np.intersect1d] (http://docs.scipy.org/doc /numpy-1.10.1/reference/generated/numpy.intersect1d.html) ничего не говорит о многомерных массивах (хотя он все равно возвращает результат, не поднимая никаких предупреждений об ошибках или предупреждениях ...). Однако это не результат, которого вы ожидаете. – Emilien

ответ

3

В идеале, вы хотели бы иметь индексы строк или маску пересекающихся них. Теперь np.intersect1d на самом деле не даст вам ни того, ни другого. Чтобы решить эту проблему, вы можете использовать np.in1d, чтобы получить маску пересекающихся строк. Таким образом, индексация с ним будет ваш желаемый результат, как так -

a1[np.in1d(a1[:,0],a2)] 

Sample пробег -

In [15]: a1 
Out[15]: 
array([[1, 2], 
     [3, 4], 
     [4, 9]], dtype=uint32) 

In [16]: a2 
Out[16]: array([8, 3, 8, 1, 0, 9, 3, 2], dtype=uint32) 

In [17]: np.in1d(a1[:,0],a2) # Intersecting rows mask for a1 
Out[17]: array([ True, True, False], dtype=bool) 

In [18]: a1[np.in1d(a1[:,0],a2)] 
Out[18]: 
array([[1, 2], 
     [3, 4]], dtype=uint32) 
+0

Привет, спасибо за ваше предложение. Это дает мне следующую ошибку в большем наборе данных: IndexError: слишком много индексов – tdma

+0

@tdma Итак, в вашем большом случае - Является ли 'a1' 2D-массив и' a2' 1D-массив? – Divakar

+0

Утвердительно, точно такая же структура просто больше строк (или пар, если вы хотите) в a1. Он начинает терпеть неудачу после примерно 1 миллиона пар/строк в a1. – tdma

Смежные вопросы