2015-03-08 1 views
1

Cela peut être un problème simple mais je n'ai pas trouvé de solution. Dites que j'ai un tableau en tant que np.array([0,1,0,1,0,0,0,1,0,1,0,0,1]) avec des pics aux index [1,3,7,9,12]. Comment puis-je remplacer les index par [2,8,12], c'est-à-dire en faisant la moyenne des index proches de la distance, si une distance de seuil entre les pics est définie pour être supérieure à 2 dans cet exemple?Étalement des index des pics s'ils sont proches en Python

Veuillez noter que les valeurs binaires de la matrice ne servent qu'à illustrer, la valeur de crête peut être n'importe quel nombre réel.

+0

Utilisez un histogramme, peut-être? –

+0

Supposons que vous ayez des pics à [1, 3, 5]. Voulez-vous [3] (moyenne des trois pics)? Ou [2,5]? Ou [1,4]? – matiasg

+0

Désolé pour le manque, je voudrais qu'il soit 3. Il n'y a peut-être pas trop de pics proches et le milieu doit être choisi sans tenir compte de la hauteur relative des pics pour la simplicité maintenant. – Francis

Répondre

0

Vous pouvez utiliser Raymond Hettinger's cluster function:

from __future__ import division 

def cluster(data, maxgap): 
    """Arrange data into groups where successive elements 
     differ by no more than *maxgap* 

     >>> cluster([1, 6, 9, 100, 102, 105, 109, 134, 139], maxgap=10) 
     [[1, 6, 9], [100, 102, 105, 109], [134, 139]] 

     >>> cluster([1, 6, 9, 99, 100, 102, 105, 134, 139, 141], maxgap=10) 
     [[1, 6, 9], [99, 100, 102, 105], [134, 139, 141]] 
    """ 
    data.sort() 
    groups = [[data[0]]] 
    for item in data[1:]: 
     val = abs(item - groups[-1][-1]) 
     if val <= maxgap: 
      groups[-1].append(item) 
     else: 
      groups.append([item]) 
    return groups 

peaks = [1,3,7,9,12] 
print([sum(arr)/len(arr) for arr in cluster(peaks, maxgap=2)]) 

cède

[2.0, 8.0, 12.0]