2014-09-08 2 views
1

У меня есть два массива«Удалить» команду для ND массивов в Python

A=np.array([[2,0], 
      [3,4], 
      [5,6]]) 

и

B=np.array([[4,3], 
      [6,7], 
      [3,4], 
      [2,0]]) 

Я хочу, чтобы существенно вычесть из А и получить индексы элементов А, которые присутствуют в B. Как это сделать? В этом примере, мне нужны ответы, как:

C=[0,1] //index in A of elements repeated in B 
D=[[2,0], [3,4]] //their value 
E=[3,2] //index location of these in B 

Несколько обычных команд, таких как ненулевым, удалить фильтр, и т.д., кажется непригодным для ND массивов. Может кто-нибудь, пожалуйста, помогите мне?

+0

Вы хотите, чтобы строки в 'B' также находились в' A' и индекс строки в каждом массиве? Это не то, что обычно подразумевается элементами или вычитанием - например, например, '[(i, r) для i, r в перечислении (A), если r в B]' – jonrsharpe

ответ

2

Вы можете определить тип данных, который будет конкатенация ваших колонок, что позволяет использовать 1d набор операций:

a = np.ascontiguousarray(A).view(np.dtype((np.void, A.shape[1]*min(A.strides)))) 
b = np.ascontiguousarray(B).view(np.dtype((np.void, B.shape[1]*min(B.strides)))) 

check = np.in1d(a, b) 
C = np.where(check)[0] 
D = A[check] 

check = np.in1d(b, a) 
E = np.where(check)[0] 

Если вы хотите только D, к примеру, вы могли бы сделать:

D = np.intersect1d(a, b).view(A.dtype).reshape(-1, A.shape[1]) 

В последнем примере обратите внимание на то, как можно восстановить оригинальный тип dtype.

+1

Большое спасибо, Саулио. Это великолепно! – Bravo

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