2010-05-18 7 views
0

J'ai un dictionnaire dont les clés sont les chaînes et les valeurs sont des tableaux numpy, par exemple:la construction d'une matrice par paires dans scipy/numpy en Python à partir de dictionnaires

data = {'a': array([1,2,3]), 'b': array([4,5,6]), 'c': array([7,8,9])} 

Je veux calculer une statistique entre toutes les paires de valeurs 'data' et construit une matrice n by x qui stocke le résultat. Supposons que je connais l'ordre des clés, à savoir que j'avoir une liste des « étiquettes »:

labels = ['a', 'b', 'c'] 

Quelle est la façon la plus efficace de calculer cette matrice?

je peux calculer la statistique pour toutes les paires comme ceci:

result = [] 
for elt1, elt2 in itertools.product(labels, labels): 
    result.append(compute_statistic(data[elt1], data[elt2])) 

Mais je veux être un résultat n par matrice n, ce qui correspond à « étiquettes » par « étiquettes ». Comment puis-je enregistrer les résultats sous cette matrice? merci.

Répondre

2

Vous pouvez utiliser une boucle imbriquée ou une compréhension de la liste comme:

result = [[compute_stat(data[row], data[col]) for col in labels] 
      for row in labels] 
2

Convertir la liste des résultats dans une matrice, puis ajuster la forme.

myMatrix = array(result) # or use matrix(result) 
myMatrix.shape = (len(labels), len(labels)) 

Si vous souhaitez indexer la matrice avec les étiquettes que vous pourriez faire

myMatrix[labels.index('a'), labels.index('b')] 

Cela devient la valeur a * b. Si c'est votre intention, il serait préférable de stocker les index dans un dictionnaire.

labelsIndex = {'a' : 0, 'b' : 1, 'c' : 2 } 
myMatrix[labelsIndex['a'], labelsIndex['b']] 

Espérons que cela aide.

Questions connexes