Python >> Tutoriel Python >  >> Python Tag >> Array

Moyen rapide de trouver la longueur et l'index de départ des éléments répétés dans le tableau

Essayons unique :

_, idx, counts = np.unique(np.cumsum(1-A)*A, return_index=True, return_counts=True)

# your expected output:
idx, counts

Sortie :

(array([ 2,  6, 10]), array([3, 2, 1]))

Voici un essai piéton, résolvant le problème en programmant le problème.

Nous préajoutons et ajoutons également un zéro à A , obtenant un vecteur ZA , puis détectez le 1 îles, et les 0 îles venant en alternance dans le ZA en comparant les versions décalées ZA[1:] et ZA[-1] . (Dans les tableaux construits on prend les places paires, correspondant à celles de A .)

import numpy as np

def structure(A):
    ZA = np.concatenate(([0], A, [0]))
    indices = np.flatnonzero( ZA[1:] != ZA[:-1] )
    counts = indices[1:] - indices[:-1]
    return indices[::2], counts[::2]

Quelques exemples d'exécution :

In [71]: structure(np.array( [0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0] ))
Out[71]: (array([ 2,  6, 10]), array([3, 2, 1]))

In [72]: structure(np.array( [1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1] ))
Out[72]: (array([ 0,  5,  9, 13, 15]), array([3, 3, 2, 1, 1]))

In [73]: structure(np.array( [1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0] ))
Out[73]: (array([0, 5, 9]), array([3, 3, 2]))

In [74]: structure(np.array( [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1] ))
Out[74]: (array([ 0,  2,  5,  7, 11, 14]), array([1, 2, 1, 3, 2, 3]))