Controllare per la lista multidimensionale in Python

voti
3

Ho alcuni dati che è 1 o 2 dimensionale. Voglio scorrere ogni modello nel set di dati ed eseguire foo () su di esso. Se i dati sono 1D quindi aggiungere questo valore a un elenco, se è in 2D poi prendere la media della lista interna e di aggiunta di questo valore. Ho visto questa domanda , e ha deciso di implementarlo controllando per esempio di un elenco. Non posso usare NumPy per questa applicazione.

    outputs = []
    for row in data:
        if isinstance(row, list):
            vals = [foo(window) for window in row]
            outputs.append(sum(vals)/float(len(vals)))
        else:
            outputs.append(foo(row))

C'è un modo più ordinato di fare questo? Su ogni corsa, ogni modello avrà la stessa dimensionalità, così ho potuto fare una classe separata per 1D / 2D, ma che aggiungerà un sacco di classi al mio codice. I set di dati possono ottenere abbastanza grande in modo da una soluzione rapida è preferibile.

È pubblicato 24/02/2014 alle 20:57
dall'utente
In altre lingue...                            


1 risposte

voti
2

Il tuo codice è già quasi come pulito e veloce come può essere. L'unico lieve miglioramento sostituisce [foo(window) for window in row]con map(foo, row), che può essere visto dai parametri:

> python -m timeit "foo = lambda x: x+1; list(map(foo, range(1000)))"
10000 loops, best of 3: 132 usec per loop
> python -m timeit "foo = lambda x: x+1; [foo(a) for a in range(1000)]"
10000 loops, best of 3: 140 usec per loop

isinstance()sembra già più veloce rispetto ai suoi omologhi hasattr()e type() ==:

> python -m timeit "[isinstance(i, int) for i in range(1000)]"
10000 loops, best of 3: 117 usec per loop
> python -m timeit "[hasattr(i, '__iter__') for i in range(1000)]"
1000 loops, best of 3: 470 usec per loop
> python -m timeit "[type(i) == int for i in range(1000)]"
10000 loops, best of 3: 130 usec per loop


Tuttavia, se si contano più breve pulito, si può anche semplificare il codice (dopo la sostituzione map) a:

mean = lambda x: sum(x)/float(len(x)) #or `from statistics import mean` in python3.4
output = [foo(r) if isinstance(r, int) else mean(map(foo, r)) for r in data]
Risposto il 13/08/2014 a 03:06
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more