2011-07-21 11 views
9

Tłumaczę niektóre rzeczy z MATLAB na język Python.Jak mogę użyć unikalnego (a, "wiersze") z MATLAB w Pythonie?

Jest to polecenie, unikatowe (a), w NumPy. Ale ponieważ program MATLAB również uruchamia polecenie "wiersze", daje coś trochę innego.

Czy istnieje podobne polecenie w języku Python, czy też powinienem zrobić algorytm, który robi to samo?

+4

Widziałeś to: http://mail.scipy.org/pipermail/numpy-discussion/2009-August/044664.html – Amro

+0

Widziałem to, ale nie ma takiego polecenia unique1d. Myślę, że usunęli to na nowej Numpy, nie jestem pewien. –

+4

Spróbuj 'unique' zamiast' unique1d' - powinien działać przykład z tego wątku. – ars

Odpowiedz

5

Założenie, że twoja tablica 2D jest przechowywana w zwykłym porządku C (to znaczy, że każdy wiersz jest liczony jako tablica lub lista w głównej tablicy, innymi słowy kolejność rzędów-głównych) lub, że transponujesz wcześniej tablicę w przeciwnym razie, można zrobić coś takiego ...

>>> import numpy as np 
>>> a = np.array([[1, 2, 3], [2, 3, 4], [1, 2, 3], [3, 4, 5]]) 
>>> a 
array([[1, 2, 3], 
     [2, 3, 4], 
     [1, 2, 3], 
     [3, 4, 5]]) 
>>> np.array([np.array(x) for x in set(tuple(x) for x in a)]) # or "list(x) for x in set[...]" 
array([[3, 4, 5], 
     [2, 3, 4], 
     [1, 2, 3]]) 

oczywiście, to naprawdę nie działa, jeśli trzeba unikatowe wiersze w oryginalnej kolejności.


Nawiasem mówiąc, aby naśladować coś unique(a, 'columns'), to po prostu transponować oryginalną tablicę, zrobić krok przedstawioną powyżej, a następnie przenieść z powrotem.

1

Można spróbować:

ii = 0; wrk_arr = your_arr 
idx = numpy.arange(0,len(wrk_arr)) 
while ii<=len(wrk_arr)-1: 
    i_list = numpy.arange(0,len(wrk_arr) 
    candidate = numpy.matrix(wrk_arr[ii,:]) 
    i_dup = numpy.array([0] * len(wrk_arr)) 
    numpy.all(candidate == wrk_arr,axis=1, iout = idup) 
    idup[ii]=0 
    i_list = numpy.unique(i_list * (1-idup)) 
    idx = numpy.unique(idx * (1-idup)) 
    wrk_arr = wrk_arr[i_list,:] 
    ii += 1 

Wyniki są wrk_arr który jest unikalny posortowana tablica your_arr. Relacja jest:

your_arr[idx,:] = wrk_arr 

To działa jak MATLAB w tym sensie, że zwrócona tablica (wrk_arr) utrzymuje porządek oryginalnej tablicy (your_arr). Tablica idx różni się od MATLAB, ponieważ zawiera indeksy pierwszego wyglądu, podczas gdy MATLAB zwraca ostatni wygląd.

Z mojego doświadczenia wynika, że ​​działał tak szybko, jak MATLAB na macierzy 10000 X 4.

A transpozycja sprawi, że sprawa będzie wyglądać w przypadku kolumny.

Powiązane problemy