2016-06-24 10 views
5

Esiste qualche funzione in numpy per raggruppare questa matrice in basso per la prima colonna?Esiste un gruppo numpy per funzione?

non ho potuto trovare alcuna buona risposta su internet ..

>>> a 
array([[ 1, 275], 
     [ 1, 441], 
     [ 1, 494], 
     [ 1, 593], 
     [ 2, 679], 
     [ 2, 533], 
     [ 2, 686], 
     [ 3, 559], 
     [ 3, 219], 
     [ 3, 455], 
     [ 4, 605], 
     [ 4, 468], 
     [ 4, 692], 
     [ 4, 613]]) 

uscita Ricercato:

array([[[275, 441, 494, 593]], 
     [[679, 533, 686]], 
     [[559, 219, 455]], 
     [[605, 468, 692, 613]]], dtype=object) 
+0

Penso che si intende una serie di liste, non elenchi di liste? –

+1

e la soluzione per panda? – MaxU

risposta

3
n = unique(a[:,0]) 
array([ list(a[a[:,0]==i,1]) for i in n]) 

uscite:

array([[275, 441, 494, 593], [679, 533, 686], [559, 219, 455], 
     [605, 468, 692, 613]], dtype=object) 
+1

per avere esattamente la stessa risposta, poiché vuole 'array ([[x] per x in [lista (a [a [:, 0] == i, 1]) per i in n]])' – efirvida

+0

sì, la tua soluzione restituisce ciò che ha chiesto. Ma ho appena dato per scontato che in realtà volesse un array di liste e non una serie inutile di liste di liste contenenti un singolo elemento – Gioelelm

+0

hahaha, lo so! – efirvida

4

Il pacchetto numpy_indexed (disclaimer: I am its aut Hor) mira a colmare questa lacuna in numpy. Tutte le operazioni in numpy-indexed sono completamente vettorizzate e nessun algoritmo O (n^2) è stato danneggiato durante la creazione di questa libreria.

import numpy_indexed as npi 
npi.group_by(a[:, 0]).split(a[:, 1]) 

noti che è solitamente più efficiente per calcolare direttamente proprietà rilevanti su tali gruppi (cioè, group_by (chiavi) .mean (valori)), anziché prima suddivisione in una lista/matrice irregolare.

0

Ispirato dalla libreria di Eelco Hoogendoorn, ma senza la sua libreria, e utilizzando il fatto che la prima colonna del tuo array è sempre in aumento.

>>> np.split(a[:, 1], np.cumsum(np.unique(a[:, 0], return_counts=True)[1])[:-1]) 
[array([275, 441, 494, 593]), 
array([679, 533, 686]), 
array([559, 219, 455]), 
array([605, 468, 692, 613])] 

non l'ho fatto "timeit", ma questo è probabilmente il modo più veloce per raggiungere la domanda:

  • No pitone ciclo nativo
  • liste dei risultati sono array NumPy, in caso di necessità di effettuare altre operazioni NumPy su di loro, sarà necessaria alcuna nuova conversione
  • Complessità come O (n)

PS: ho scritto una linea simile perché avevo bisogno di "gruppo da" i risultati di np.nonzero:

>>> indexes, values = np.nonzero(...) 
>>> np.split(values, np.cumsum(np.unique(indexes, return_counts=True)[1])) 
Problemi correlati