2011-09-08 28 views
38

Tengo que agrupar los elementos consecutivos de una matriz numpy. teniendo en cuenta el siguiente ejemplocómo encontrar los grupos de elementos consecutivos de una matriz en numpy?

a = [ 0, 47, 48, 49, 50, 97, 98, 99] 

La salida debe una lista de tuplas de la siguiente manera

[(0),(47, 48, 49, 50),(97, 98, 99)] 

aquí la diferencia es sólo uno. entre el elemento. Será genial si la diferencia también se puede especificar como un límite o un número codificado.

Muchas gracias.

+0

Encontré esta respuesta teniendo EXACTAMENTE el mismo problema ... ¡Pequeño mundo! : o) – heltonbiker

+0

Posible duplicado de [Identificar grupos de números continuos en una lista] (http://stackoverflow.com/questions/2154249/identify-groups-of-continuous-numbers-in-a-list) – styvane

+0

Ver también: https://stupidpythonideas.blogspot.com/2014/01/grouping-into-runs-of-adjacent-values.html – ShreevatsaR

Respuesta

12

Aquí hay una func lil que podría ayudar:

def group_consecutives(vals, step=1): 
    """Return list of consecutive lists of numbers from vals (number list).""" 
    run = [] 
    result = [run] 
    expect = None 
    for v in vals: 
     if (v == expect) or (expect is None): 
      run.append(v) 
     else: 
      run = [v] 
      result.append(run) 
     expect = v + step 
    return result 

>>> group_consecutives(a) 
[[0], [47, 48, 49, 50], [97, 98, 99]] 
>>> group_consecutives(a, step=47) 
[[0, 47], [48], [49], [50, 97], [98], [99]] 
+2

P.S. Si desea tuplas en lugar de listas, puede hacer 'tuple (map (tuple, group_consecutives (a)))' – dkamins

+0

¡Gracias, esto se ajusta perfectamente a mis necesidades! – Shan

+3

¡Esta no es una solución NumPy! – marscher

0

Esto suena un poco como tarea, por lo que si no te importa voy a sugerir un enfoque

Puede iterar sobre una lista utilizando

for i in range(len(a)): 
    print a[i] 

podría probar el siguiente elemento de la lista se encuentra con alguna criterios como sigue

if a[i] == a[i] + 1: 
    print "it must be a consecutive run" 

Y se puede almacenar por separado los resultados en

results = [] 

Ten cuidado - hay un índice error fuera de oculto en lo anterior que se necesitan para hacer frente a

+2

Por favor, no sugiera usar iteradores de python sobre matrices numpy cuando existen soluciones más obvias. Derrota el propósito de usar numpy. (generalmente.) Si al OP no le importaba el rendimiento, probablemente habrían usado una lista de Python. – Paul

6

(a[1:]-a[:-1])==1 producirá una matriz booleana, donde False indica roturas en las carreras. También puede usar el built-in numpy.grad.

+0

solución genial 1up – Shan

+0

No entiendo esta respuesta, aunque es la única que parece "funcional" (como en el lenguaje funcional). Lo que estás haciendo aquí es aplicar el operador menos a la lista. No veo cómo podría funcionar eso. –

+2

@LukeSkywalker No es funcional. 'a' en este caso es una matriz numpy, no una lista y el operador de menos realiza una resta de elemento. – Paul

4

esto es lo que ocurrió hasta ahora: no estoy seguro es 100% correcto

import numpy as np 
a = np.array([ 0, 47, 48, 49, 50, 97, 98, 99]) 
print np.split(a, np.cumsum(np.where(a[1:] - a[:-1] > 1))+1) 

devuelve:

>>>[array([0]), array([47, 48, 49, 50]), array([97, 98, 99])] 
+0

cool solution 1 up – Shan

+1

Ejemplo de contador: a = np.array ([0, 47, 48, 49, 50, 97, 98, 99, 101, 102, 103, 140, 141]) print (np.split (a , np.cumsum (np.where (a [1:] - a [: - 1]> 1)) +1)) produce [matriz ([0]), matriz ([47, 48, 49, 50]) , array ([97, 98, 99, 101, 102, 103, 140]), array ([141]), array ([], dtype = int64)] – Back2Basics

100
def consecutive(data, stepsize=1): 
    return np.split(data, np.where(np.diff(data) != stepsize)[0]+1) 

a = np.array([0, 47, 48, 49, 50, 97, 98, 99]) 
consecutive(a) 

rendimientos

[array([0]), array([47, 48, 49, 50]), array([97, 98, 99])] 
+1

¡No me di cuenta de que 'array_split' existía! ¡Eso es bastante útil! ¡Gracias! –

+2

cool solution 1 up – Shan

+1

Y para encontrar ejecuciones de cadenas idénticas: 'particiones = np.where (a [1:]! = A [: - 1]) [0] + 1' (' np.diff' no trabajar para cadenas) – z0r

Cuestiones relacionadas