2012-09-06 18 views
16

Ich habe ein numpy ndarray mit der Form von (30.480.640), die 1. und 2. Achse, die Positionen (Breite und Länge) darstellt, die 0. Achse enthält tatsächliche Datenpunkte. Ich möchte den häufigsten Wert entlang der 0. Achse an jedem Ort verwenden , das ein neues Array mit Form von (1.480.640) .ie zu konstruieren:Wie findet man die häufigsten Werte in 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]]]) 

Die Datenpunkte negtive und positive Schwimm Zahlen enthält. Wie kann ich solche Berechnungen durchführen? Danke vielmals!

Ich versuchte mit numpy.unique, aber ich bekam "TypeError: unique() hat ein unerwartetes Schlüsselwortargument 'return_inverse'". Ich benutze numpy Version 1.2.1 unter Unix installiert und es unterstützt nicht return_inverse. .Ich habe auch versucht, Modus, aber es dauert ewig, um so große Datenmengen zu verarbeiten ... gibt es also eine alternative Möglichkeit, die häufigsten Werte zu erhalten? Danke noch einmal.

+2

Was meinst du mit dominantem Wert? Ich verstehe die Frage nicht. –

+0

Ich werde den Kommentar von @HenryGomersall - Ich habe kein Scooby, was Ihre Frage ist entweder ... –

+0

Sorry für Ihre Verwirrung ... Ich meine die häufigsten Werte .. – oops

Antwort

14

zu den häufigsten Wert einer flachen Anordnung finden, verwenden unique, bincount und 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))] 

mit einem mehrdimensionalen Array umgehen, müssen wir über unique keine Sorge, aber wir brauchen verwenden apply_along_axis auf 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)] 

mit Ihren Daten:

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, wirklich? Sie np.unique(return_inverse=True) nähern vernünftigerweise effizient np.searchsorted (es ist ein zusätzlicher O (n log n), so sollte die Leistung nicht wesentlich verändern) mit:

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

habe es nicht versuchen, aber danke a Menge! – oops

+0

@ ecatmur, ich benutze numpy Version 1.2.1 und es unterstützt nicht np.unique (return_inverse) .. irgendwelche Vorschläge? – oops

+0

@Oops siehe oben, du musst es selbst testen, da ich keine Ahnung habe, wo ich überhaupt eine so alte Version von numpy finden würde;) – ecatmur

0

flatten Ihr Array, dann bauen Sie eine collections.Counter daraus. Wie immer sollten Sie beim Vergleichen von Fließkommazahlen besondere Vorsicht walten lassen.

4

Verwenden SciPy der Modus-Funktion:

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

Vielen Dank Taro Sato, aber es dauert sehr lange, große Arrays zu verarbeiten ..einen Vorschlag, um es zu beschleunigen? – oops

+0

Okay, ich habe bemerkt, dass du das mit Floats machen willst. Um das zu tun, brauche ich einen etwas anderen Ansatz, da es nicht wirklich sinnvoll ist zu fragen, was der häufigste Float ist, da es nur eine geringe Chance gibt, dass zwei Floats von wiederholten Experimenten zusammenfallen. Müssen Sie wirklich so eine seltsame Sache finden? Wenn Sie (ungefähr) die Verteilung Ihrer Stichprobe kennen, dann gibt es bessere Berechnungsmethoden wie Mittelwert und Median, um herauszufinden, welche Wahrscheinlichkeit in Ihrer Stichprobe am wahrscheinlichsten ist. –

+0

Leute immer noch weit verbreitet scipy Paket? Lies irgendwo, dass die Bedeutung von scipy veraltet ist.Nur neugierig zu wissen :) –

Verwandte Themen