2010-09-08 8 views
1

j'ai besoin d'accéder à des variables donné leur nom, de la manière suivante:Accéder à des variables par leurs noms dans un tuple

a = numpy.array([1,2,3]) 
b = numpy.array([4,5,6]) 
names = ('a', 'b') 

Ensuite, je passe la names variable à une fonction, disons numpy.hstack() à obtenir le même résultat qu'avec numpy.hstack((a,b)).

Quelle est la meilleure façon pythonique de le faire?

Et quel est le but? J'ai une fonction, qui accepte les noms de tableaux chiffrés et empile les tableaux associés (définis dans la fonction) ensemble pour les traiter. J'ai besoin de créer toutes les combinaisons possibles de ces tableaux, par conséquent:

  1. Une combinaison (tuple) de noms de tableau est créée.
  2. La combinaison (tuple) est passée à une fonction en tant qu'argument.
  3. La fonction concatène les tableaux associés et traite le résultat.

Espérons que cette question n'est pas trop cryptique. Merci pour les réponses à l'avance :-)

+2

Pourquoi n'utilisez-vous pas 'collections.namedtuple'? –

+1

Eh bien, dans le cas ci-dessus, je ne vois aucune raison pour cela. Cependant, toute inspiration est la bienvenue :-) – camillio

Répondre

2

Vous pouvez utiliser la fonction intégrée locals, qui retourne un dictionnaire représentant l'espace de noms local:

>>> a = 1 
>>> locals()['a'] 
1 

>>> a = 1; b = 2; c = 3 
>>> [locals()[x] for x in ('a','b','c')] 
[1, 2, 3] 

Vous pouvez également stocker simplement vos tableaux dans votre propre dictionnaire, ou dans un module.

+0

Oui, la liste des compréhensions avec les locaux() fait le travail! Merci :-) – camillio

2

Si je comprends bien votre question, vous devez utiliser locals() comme ceci:

def lookup(dic, names): 
    return tuple(dic[name] for name in names) 

... 
a = numpy.array([1,2,3]) 
b = numpy.array([4,5,6]) 
names = ('a', 'b') 
numpy.hstack(lookup(locals(), names)) 
1

Peut-être que j'ai mal compris, mais je voudrais simplement utiliser la fonction intégrée eval et procédez comme suit. Je ne sais pas si c'est particulièrement pythonique, remarquez.

numpy.concatenate([eval(n) for n in names]) 
+0

Je préfère éviter 'eval' car il peut apporter plus de problèmes que d'avantages. – camillio

+0

Si vous pouvez utiliser les locaux en toute sécurité, vous pouvez utiliser eval en toute sécurité. (Aucun ne devrait être utilisé si l'espace de noms et les entrées ne sont pas contrôlés.) Il ne paie pas d'être irrationnellement évalphobique. Ici, cependant, l'utilisation locale est probablement plus facile à lire, puisque sa signification est plus spécifique. –

2

Puisque vous utilisez numpy, et que vous souhaitez faire référence à des tableaux par des noms, il semble peut-être vous devriez utiliser un recarray:

import numpy as np 
import itertools as it 

a = np.array([1,2,3]) 
b = np.array([4,5,6]) 
c = np.array([7,8,9]) 
names=('a','b','c') 
arr=np.rec.fromarrays([a,b,c],names=names) 

Une fois que vous définissez le recarray arr, vous pouvez accéder à la colonnes individuelles par nom:

In [57]: arr['a'] 
Out[57]: array([1, 2, 3]) 

In [58]: arr['c'] 
Out[58]: array([7, 8, 9]) 

Ainsi, pour générer des combinaisons de noms, et combinons les colonnes avec np.hstack, vous pouvez le faire:

for comb in it.combinations(names,2): 
    print(np.hstack(arr[c] for c in comb)) 
# [1 2 3 4 5 6] 
# [1 2 3 7 8 9] 
# [4 5 6 7 8 9] 
Questions connexes