2012-09-06 12 views
16

Mam numpy ndarray z kształtem (30,480,640), 1 i 2 oś reprezentujących lokalizacje (szerokość i longitute), oś 0 zawiera rzeczywiste punkty danych. Chcę korzystać z najczęstszych wartości wzdłuż 0 osi w każdej lokalizacji , który jest skonstruowanie nowych tablicę kształtu (1480640) .ie:Jak znaleźć najczęstsze wartości w numpy ndarray?

>>> data 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]], 

     [[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]], 

     [[40, 40, 42, 43, 44], 
     [45, 46, 47, 48, 49], 
     [50, 51, 52, 53, 54], 
     [55, 56, 57, 58, 59]]]) 

(perform calculation) 

>>> new_data 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]]) 

punkty danych będzie zawierał negtive i dodatnich liczb zmiennoprzecinkowych. Jak mogę wykonać takie obliczenia? Wielkie dzięki!

Próbowałem z numpy.unique, ale dostałem "TypeError: unique() otrzymałem nieoczekiwany argument słowa kluczowego" return_inverse "" Używam numpy w wersji 1.2.1 zainstalowanej na Uniksie i nie obsługuje return_inverse. .Spróbowałem także tryb, ale przetwarzanie tak dużej ilości danych trwa wiecznie ... więc czy istnieje alternatywny sposób na uzyskanie najczęstszych wartości? Dzięki jeszcze raz.

+2

Co masz na myśli, mówiąc o wartości dominującej? Nie rozumiem tego pytania. –

+0

Wezmę komentarz przez @HenryGomersall - Nie mam Scooby'ego, na co twoje pytanie jest albo ... –

+0

Przepraszamy za zamieszanie ... Chodziło mi o najczęstsze wartości .. – oops

Odpowiedz

14

Aby znaleźć najbardziej częste wartość płaskiej tablicy, użyj unique, bincount i argmax:

arr = np.array([5, 4, -2, 1, -2, 0, 4, 4, -6, -1]) 
u, indices = np.unique(arr, return_inverse=True) 
u[np.argmax(np.bincount(indices))] 

Aby pracować z tablicy wielowymiarowej, nie trzeba się martwić o unique, ale musimy używać apply_along_axis na bincount:

arr = np.array([[5, 4, -2, 1, -2, 0, 4, 4, -6, -1], 
       [0, 1, 2, 2, 3, 4, 5, 6, 7, 8]]) 
axis = 1 
u, indices = np.unique(arr, return_inverse=True) 
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape), 
           None, np.max(indices) + 1), axis=axis)] 

z danymi:

data = np.array([ 
    [[ 0, 1, 2, 3, 4], 
    [ 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 14], 
    [15, 16, 17, 18, 19]], 

    [[ 0, 1, 2, 3, 4], 
    [ 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 14], 
    [15, 16, 17, 18, 19]], 

    [[40, 40, 42, 43, 44], 
    [45, 46, 47, 48, 49], 
    [50, 51, 52, 53, 54], 
    [55, 56, 57, 58, 59]]]) 
axis = 0 
u, indices = np.unique(arr, return_inverse=True) 
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape), 
           None, np.max(indices) + 1), axis=axis)] 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

NumPy 1,2, naprawdę? Można zbliżenie np.unique(return_inverse=True) racjonalnie efektywne wykorzystanie np.searchsorted (to dodatkowy O (n dziennika n), więc nie powinno znacząco zmienić wydajność):

u = np.unique(arr) 
indices = np.searchsorted(u, arr.flat) 
+0

nie próbowałem, ale dzięki los! – oops

+0

@ ecatmur, używam numpy w wersji 1.2.1 i nie obsługuje np.unique (return_inverse) .. żadnych sugestii? – oops

+0

@Opinie patrz wyżej, będziesz musiał przetestować to sam, ponieważ nie mam pojęcia, gdzie znajdę nawet starą wersję numpy;) – ecatmur

0

flatten Twoja tablica, a następnie zbuduj z niej collections.Counter. Jak zwykle należy zachować szczególną ostrożność przy porównywaniu liczb zmiennoprzecinkowych.

4

funkcja Użyj trybu scipy za:

import numpy as np 
from scipy.stats import mode 

data = np.array([[[ 0, 1, 2, 3, 4], 
        [ 5, 6, 7, 8, 9], 
        [10, 11, 12, 13, 14], 
        [15, 16, 17, 18, 19]], 

       [[ 0, 1, 2, 3, 4], 
        [ 5, 6, 7, 8, 9], 
        [10, 11, 12, 13, 14], 
        [15, 16, 17, 18, 19]], 

       [[40, 40, 42, 43, 44], 
        [45, 46, 47, 48, 49], 
        [50, 51, 52, 53, 54], 
        [55, 56, 57, 58, 59]]]) 

print data 

# find mode along the zero-th axis; the return value is a tuple of the 
# modes and their counts. 
print mode(data, axis=0) 
+0

Dziękuję Taro Sato, ale przetwarzanie dużych tablic zajmuje bardzo dużo czasu ..na sugestia, aby przyspieszyć? – oops

+0

Dobra, zauważyłem, że chcesz to zrobić za pomocą pływaków. Aby to zrobić, myślę, że potrzebujesz nieco innego podejścia, ponieważ nie ma sensu pytać, co jest najczęstszym floatem, ponieważ istnieje tylko niewielka szansa, że ​​dwie spływy pokrywają się z powtarzającymi się eksperymentami. Czy naprawdę musisz znaleźć taką dziwną rzecz? Znam (w przybliżeniu) rozkład twojej próbki, następnie są lepsze środki do obliczenia, takie jak średnia i mediana, aby dowiedzieć się, jaka jest najbardziej prawdopodobna liczba w twojej próbce. –

+0

czy ludzie nadal szeroko stosowane pakiet scipy? Przeczytaj gdzieś, co znaczy, że scipy jest przestarzałe.Po prostu ciekawa :) –

Powiązane problemy