2 votes

Comment convertir les Trues consécutifs dans un tableau 3D en valeurs entières représentant la longueur de ce groupe consécutif

Je possède un tableau numpy (61,77,365) rempli de valeurs booléennes.

Prenons une tranche aléatoire sur l'axe 2 (len = 365) à titre d'exemple :

data = [False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True False False False False True False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False

0voto

Je ne suis pas sûr si c'est plus rapide, mais vous pouvez essayer de cette façon. Tout d'abord, puisque votre tableau est déjà en numpy, vous pouvez utiliser np.where pour changer le booléen en 0 et 1.

myarray = np.where(data == True,1,0)

Ensuite, vous devez obtenir l'indice des 1 en utilisant np.where ou np.nonzero (si vous l'essayez dans votre tableau complet, np.nonzero sera plus rapide que np.where.)

indexes = np.nonzero(myarray == 1)

Avec cela, nous allons utiliser une fonction postée par Unutbu pour diviser les indices en fonction des valeurs consécutives. Le lien est ici https://stackoverflow.com/a/7353335/16836078

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

split_index = consecutive(indexes[0])

Pour la dernière partie, je m'excuse si cela ne correspond pas à vos besoins, nous utiliserons une boucle for pour assigner le nombre accumulé des valeurs consécutives au tableau d'origine.

for i in split_index:
    number = len(i)
    myarray[i] = number

myarray

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0,

0voto

SomeDude Points 4150

La clé est d'obtenir les indices auxquels les valeurs True sont présentes ainsi que la longueur des valeurs True.

Créez d'abord un dataframe à partir des données comme suit:

df = pd.DataFrame({'data':data})

Vous pouvez d'abord obtenir la somme cumulative des True, False en utilisant ce truc:

tf = (df['data'] != df['data'].shift()).cumsum()

Ensuite, créez un autre dataframe uniquement pour les valeurs True comme suit:

df2 = pd.DataFrame(tf[df['data']])

Ensuite, réinitialisez l'index pour obtenir les indices auxquels les valeurs sont True (ceci est important) et regroupez et ajoutez la liste des indices:

df2 = df2.reset_index().rename(columns={'index':'trues'}).groupby('data',as_index=False).agg(list)

Ensuite, obtenez la longueur de chaque liste

df2['data'] = df2['trues'].apply(lambda x:len(x))

Ensuite, dépliez la liste

df2 = df2.explode('trues')

Ensuite, définissez l'index et supprimez le nom afin de pouvoir le localiser dans votre dataframe original et l'assigner correctement

df2 = df2.set_index('trues', drop=True)
df2.index.name = ''

Assignez maintenant les valeurs dans le dataframe original

df.iloc[df2.index] = df2['data']

Tout le code est le suivant:

df = pd.DataFrame({'data':data})
tf = (df['data'] != df['data'].shift()).cumsum()
df2 = pd.DataFrame(tf[df['data']])
df2 = df2.reset_index().rename(columns={'index':'trues'}).groupby('data',as_index=False).agg(list)
df2['data'] = df2['trues'].apply(lambda x:len(x))
df2 = df2.explode('trues')
df2 = df2.set_index('trues', drop=True)
df2.index.name = ''
df.iloc[df2.index] = df2['data']

Votre réponse finale se trouve dans df['data']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X