2013-09-30 5 views
2

У меня есть два массива numpy, которые представляют собой 2D-координаты. Каждая строка представляет (x, y) пар:Удалить элементы из массива numpy по значению

a = np.array([[1, 1], [2, 1], [3, 1], [3, 2], [3, 3], [5, 5]]) 
b = np.array([[1, 1], [5, 5], [3, 2]]) 

Я хотел бы удалить элементы из a, которые находятся в b эффективно. Таким образом, результат будет:

array([[2, 1], [3, 1], [3, 3]]) 

я могу сделать это с помощью цикла и сравнения, я надеялся, что я мог сделать это проще.

+0

Это дубликат, я извиняюсь, я сделал поиск, но не смог найти ответ. – enedene

+5

@enedene Не беспокойтесь, отмечая вопрос как дубликат, это не обвинение или наказание, это скорее скорее указатель на место, где уже есть ответы. Вы задали вопрос более четко, imo, но ответы уже существуют. – askewchan

ответ

0

Python sets делает хорошую работу по предоставлению различий. Это не так, хотя, поддерживать порядок

np.array(list(set(tuple(x) for x in a.tolist()).difference(set(tuple(x) for x in b.tolist())))) 

Или использовать логическое индексирование, использовать вещания для создания outer equals и sum с any и all

A = np.all((a[None,:,:]==b[:,None,:]),axis=-1) 
A = np.any(A,axis=0) 
a[~A,:] 

Или сделать a и b комплексов:

ac = np.dot(a,[1,1j]) 
bc = np.dot(b,[1,1j]) 
A = np.any(ac==bc[:,None],axis=0) 
a[~A,:] 

или использовать setxor1d

xx = np.setxor1d(ac,bc) 
# array([ 2.+1.j, 3.+1.j, 3.+3.j]) 
np.array([xx.real,xx.imag],dtype=int).T 

=================

In [222]: ac = np.dot(a,[1,1j]) 
    ...: bc = np.dot(b,[1,1j]) 
In [223]: ac 
Out[223]: array([ 1.+1.j, 2.+1.j, 3.+1.j, 3.+2.j, 3.+3.j, 5.+5.j]) 
In [225]: bc 
Out[225]: array([ 1.+1.j, 5.+5.j, 3.+2.j]) 
In [226]: ac == bc[:,None] 
Out[226]: 
array([[ True, False, False, False, False, False], 
     [False, False, False, False, False, True], 
     [False, False, False, True, False, False]], dtype=bool) 
+0

Мне любопытно узнать, как решить этот вопрос. Я вижу, что это работает, но было бы здорово узнать, почему. – rmooney

+1

Составляя их сложные сочетания каждой пары в одно комплексное число. И для комплексных чисел определено равенство. Это просто еще один способ уменьшить размерность проблемы. – hpaulj

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