2017-10-05 1 views
0

Existe-t-il un moyen élégant/pythonique pour récupérer les deux les corrélations croisées et automatiques des éléments d'une liste?Python itertools combinaisons, y compris les auto-corrélations

Je pourrais le faire manuellement, bien que je voudrais essayer et utiliser itertools.combinations, qui par défaut ne semble pas produire des auto-corrélations [(1,1), (2,2), etc.].

Cette question traite effectivement les croisées -correlations seulement:

Calculating correlations between every item in a list

Essayez ceci pour un MWE:

import itertools 
data = range(4); crosscorrs=[] 
# Get the cross-correlations: 
for (i,j) in itertools.combinations(data, 2): 
    crosscorrs.append((i,j)) 
# How to get the auto-correlations? 
# What about the (j,i) correlations even?! 
# Result 
print crosscorrs 

Qu'en est-(j, i) les corrélations même! ?

Merci pour aider

Répondre

0

Il y a un certain nombre de choses qui clochent la question, y compris un morceau de code exemple qui déclenche une Exception, mais je vais tenter de répondre à ce que vous semblez demander. Comme vous nommez la collection «crosscorrs», je suppose que vous voulez des listes séparées pour les indices de «corrélation croisée» et les indices d '«autocorrélation». Pour obtenir les indices (j, i), vous pouvez simplement vous y référer comme tel. Le même-index-stuff peut être ajouté à un ensemble, pour éviter d'avoir des doublons.

from itertools import combinations 
data = range(4) 
crosscorrs=[] 
autocorrs = set() 

for (i,j) in combinations(data,2): 
    crosscorrs.extend([(i,j),(j,i)]) 
    autocorrs.add((i,i)) 
    autocorrs.add((j,j)) 

print(crosscorrs, '\n') 
print(list(autocorrs)) 

Si vous voulez tout cela pour aller dans 1 collection, jetez un oeil à itertools.combinations_with_replacement et la possibilité d'inverser data par data[::-1]. Très probablement, un set peut être utile, car il prend en charge les opérations union.