2013-03-29 13 views
5

Ho un insieme di dati come questo:eliminare il primo elemento di visualizzazione secondaria di una matrice

[[0,1], 
[0,2], 
[0,3], 
[0,4], 
[1,5], 
[1,6], 
[1,7], 
[2,8], 
[2,9]] 

devo eliminare i primi elementi di ciascuna visualizzazione secondaria dei dati come definito dalla prima colonna. Quindi prima raccolgo tutti gli elementi che hanno 0 nella prima colonna e cancelliamo la prima riga: [0,1]. Poi ottengo gli elementi con 1 nella prima colonna e cancella la prima riga [1,5], il prossimo passo che cancello [2,8] e così via e così via. Alla fine, mi piacerebbe avere un set di dati come questo:

[[0,2], 
[0,3], 
[0,4], 
[1,6], 
[1,7], 
[2,9]] 

EDIT: Può questo essere fatto in numpy? Il mio set di dati è molto grande, quindi i loop su tutti gli elementi richiedono almeno 4 minuti per essere completati.

+0

Che cosa hai provato, e dove sei bloccato? Otterrai risposte migliori e migliori a domande specifiche rispetto alle affermazioni generali "per favore fai il mio problema per me". –

+0

@ Robᵩ Ho provato a utilizzare le maschere per ottenere ciascuna sottoview ed eliminare la riga nella sottoview, ma non so come eliminare la riga nel set di dati originale. Pubblicherò presto il codice – siamii

+0

Sono ordinati? Quindi, sono elenchi annidati con valori uguali nell'indice 0 raggruppati? –

risposta

3

come richiesto, una soluzione numpy:

import numpy as np 
a = np.array([[0,1], [0,2], [0,3], [0,4], [1,5], [1,6], [1,7], [2,8], [2,9]]) 
_,i = np.unique(a[:,0], return_index=True) 

b = np.delete(a, i, axis=0) 

(sopra è a cura di incorporare @ soluzione di Jaime, ecco la mia soluzione di mascheramento originale per l'amor del posteri)

m = np.ones(len(a), dtype=bool) 
m[i] = False 
b = a[m] 

Intere stingly, la maschera sembra essere più veloce:

In [225]: def rem_del(a): 
    .....:  _,i = np.unique(a[:,0], return_index=True) 
    .....:  return np.delete(a, i, axis = 0) 
    .....: 

In [226]: def rem_mask(a): 
    .....:  _,i = np.unique(a[:,0], return_index=True) 
    .....:  m = np.ones(len(a), dtype=bool) 
    .....:  m[i] = False 
    .....:  return a[m] 
    .....: 

In [227]: timeit rem_del(a) 
10000 loops, best of 3: 181 us per loop 

In [228]: timeit rem_mask(a) 
10000 loops, best of 3: 59 us per loop 
+1

+1 Ma mantenendo lo stesso approccio generale, non sarebbe 'b = np.delete (a, i, axis = 0)' un'opzione migliore di quelle ultime tre righe? – Jaime

+0

Grazie a @Jaime, avevo quasi commentato che l'ultimo bit probabilmente ha un'implementazione migliore: P – askewchan

+0

Anche se @Jaime, la maschera sembra essere più veloce? – askewchan

1

che si desidera utilizzare itertools.groupby() con un pizzico di itertools.islice() e itertools.chain:

from itertools import islice, chain, groupby 
from operator import itemgetter 

list(chain.from_iterable(islice(group, 1, None) 
         for key, group in groupby(inputlist, key=itemgetter(0)))) 
  • I groupby() gruppi di chiamata della lista di input in blocchi in cui il primo elemento è la stessa (itemgetter(0) è la chiave di raggruppamento).
  • La chiamata islice(group, 1, None) trasforma i gruppi in iterabili in cui viene saltato l'elemento primo.
  • La chiamata chain.from_iterable() prende ogni risultato islice() e li incatena in un nuovo iterabile, che list() torna in un elenco.

Demo:

>>> list(chain.from_iterable(islice(group, 1, None) for key, group in groupby(inputlist, key=itemgetter(0)))) 
[[0, 2], [0, 3], [0, 4], [1, 6], [1, 7], [2, 9]] 
0
a = [[0,1], 
[0,2], 
[0,3], 
[0,4], 
[1,5], 
[1,6], 
[1,7], 
[2,8], 
[2,9]] 

a = [y for x in itertools.groupby(a, lambda x: x[0]) for y in list(x[1])[1:]] 

print a 
0

La mia risposta è:

from operator import itemgetter 
sorted(l, key=itemgetter(1)) # fist sort by fist element of inner list 
nl = [] 
[[0, 1], [0, 2], [0, 3], [0, 4], [1, 5], [1, 6], [1, 7], [2, 8], [2, 9]] 
j = 0; 
for i in range(len(l)): 
    if(j == l[i][0]): 
     j = j + 1 # skip element 
    else: 
     nl.append(l[i]) # otherwise append in new list 

output è:

>>> nl 
[[0, 2], [0, 3], [0, 4], [1, 6], [1, 7], [2, 9]] 
2

Passo negli elenchi e la chiave che si desideracontrollare i valori su

def getsubset(set, index): 
    hash = {} 
    for list in set: 
     if not list[index] in hash: 
      set.remove(list) 
      hash[list[index]] = list 

    return set 
+0

Questo è veloce, ma non c'è bisogno di 'return set' come questo muta 'set' in luogo. – askewchan

Problemi correlati