2013-05-23 4 views
2

Мне просто нужно удалить строки, которые повторяются в массиве, но поддерживать один из них, я не могу использовать уникальный, потому что мне нужно поддерживать порядок. ПримерNumpy удалять повторяющиеся строки

1 a234 125 
1 a123 265 
1 a234 125 
1 a145 167 
1 a234 125  
2 a189 547 
2 a189 547  
3 a678 567 
3 a357 569 

мне нужен этот вывод

1 a234 125 
1 a123 265 
1 a145 167  
2 a189 547 
3 a678 567 
3 a357 569 
+0

Являются ли ваши строки различимыми, например, первый, столбец? – Jan

+0

Нет, они не ... Я сделал пример яснее – Alice

+1

См. Вопрос относительно этого [здесь] (http://stackoverflow.com/questions/12926898/numpy-unique-without-sort). – hooy

ответ

5

Я думаю, это делает то, что вы хотите, и использует np.unique с аргументом return_index ключевого слова:

import numpy as np 

a = np.array([[1, 'a234', 125], 
       [2, 'b189', 547], 
       [1, 'a234', 125], 
       [3, 'c678', 567], 
       [1, 'a234', 125], 
       [2, 'b189', 547]]) 

b = a.ravel().view(np.dtype((np.void, a.dtype.itemsize*a.shape[1]))) 
_, unique_idx = np.unique(b, return_index=True) 

new_a = a[np.sort(unique_idx)] 

>>> new_a 
array([['1', 'a234', '125'], 
     ['2', 'b189', '547'], 
     ['3', 'c678', '567']], 
     dtype='|S4') 

hackiest часть является вид b, который превращает каждую строку в один элемент np.voiddtype, так что l строк можно сравнить для равенства на np.unique.

+0

@Ali_Sce Вы не должны включать в свой код '>>>' и все после этого. – hooy

+0

Я этого не делал ... Я новичок, но я пытаюсь понять вещи;) – Alice

+1

Когда я запускаю его, мне нужно установить 'new_a = a [np.sort (unique_idx [1])]' иначе 'unique_idx 'был бы кортежем из двух массивов, а для остальных - совершенным! На самом деле хаки, по крайней мере для меня! – Alice

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