Conta elementi array reali

0

Nel mio codice (Python + numpy o Matlab, ma il problema può riguardare qualsiasi linguaggio di programmazione di array), spesso devo contare il numero di elementi in un array in cui gli elementi sono veri. Solitamente, lo implemento come sum(x>0.5) , ma ciò può essere considerato improprio. Vedi È corretto aggiungere booleani per contare il numero di valori veri in un vettore? . Numpy ha count_nonzero , ma se non c'è uno speciale -purpose function, quale sarebbe il modo corretto di scrivere questo?

Ad esempio, in Matlab , posso scrivere sum(x>.5) o length(find(x>0.5)) . Il primo è leggermente più veloce ma può essere considerato improprio (vedi sopra). Esistono altre alternative per il conteggio del numero di valori veri in un array e quali dovrebbero essere i miei criteri per selezionarne uno?

(In un linguaggio di basso livello, si scriverebbe un ciclo for esplicito, ma questo è un modo estremamente inefficiente per implementarlo in un linguaggio di programmazione di array di alto livello)

    
posta gerrit 18.02.2013 - 10:53
fonte

3 risposte

1

Questo mi sembra un uso naturale per una piega per me

vale a dire. qualcosa di simile in codice pseudo funzionale

let countiftrue bs = fold (fun acc b -> if b then acc + 1 else acc) 0 bs

Meglio ancora averlo come funzione di ordine superiore che accetta un predicato per renderlo ancora più utile

let countif p xs = fold (fun acc x -> if p x then acc + 1 else acc) 0 xs
    
risposta data 18.02.2013 - 18:54
fonte
0

Sembra che se vuoi contare i veri elementi, probabilmente vuoi ottenere gli elementi veri in qualche altro contesto. Inoltre, secondo me, ottenere gli elementi veri e poi contarli legge

Il mio pitone è arrugginito, ma questo ti darà l'idea generale:

def take_true(list):
  return [x for x in list if x]

def true_count(list):
  return len(take_true(list))
    
risposta data 19.02.2013 - 05:14
fonte
0

In Python puoi usare le espressioni del generatore con molte funzioni incorporate. sum(x for x in vec if x > 0.5) e len(x for x in vec if abs(x) > 1.0) sono perfettamente validi. Sono equivalenti a usare una comprensione di lista come sum([x for x in vec if x > 0.5]) ma non hanno il sovraccarico di dover creare un elenco temporaneo.

Puoi estendere questa idea esaminando la mappa, il filtro e l'amp; riduci (così come le versioni itertools che gestiscono in modo più efficiente gli iteratori).

    
risposta data 19.02.2013 - 19:44
fonte

Leggi altre domande sui tag