2009-11-10 11 views
0

je veux réaliser ce qui suit:Accès à un élément de matrice par matrice [(a, b), c] au lieu de la matrice [a, b, c]

  1. Avoir une matrice AxBxC (où A, B , C sont entiers).
  2. Access Matrice non comme matrice [a, b, c], mais en tant que matrice [(a, b), c], ce est, j'ai deux variables, var1 = (x, y) et var2 = z et souhaitez accéder à ma matrice en tant que matrice [var1, var2].

Comment cela peut-il être fait? J'utilise une matrice numpy, si cela fait une différence.

Je sais que je pourrais utiliser la matrice [var1 [0], var1 [1], var2], mais si possible je voudrais savoir s'il existe une autre manière plus élégante.

Merci!

+1

matrice [a, b] [c]? –

+0

Ajoutez cela comme asnwer et je vais le noter. Merci! –

Répondre

3

Si var1 = (x,y) et var2 = z, vous pouvez utiliser

matrix[var1][var2] 
1

Je pense que vous pouvez simplement sous-classe du type de matrice NumPy, avec une nouvelle classe de votre propre; et surchargez le __getitem__() nethod pour accepter un tuple. Quelque chose comme ceci:

class SpecialMatrix(np.matrix): 
    def __getitem__(self, arg1, arg2, arg3=None): 
     try: 
      i, j = arg1 
      k = arg2 
      assert(arg3 is None) 
      x = super(SpecialMatrix, self).__getitem__(i, j, k) 
     except TypeError: 
      assert(arg3 is not None) 
      return super(SpecialMatrix, self).__getitem__(arg1, arg2, arg3) 

Et faire quelque chose de similaire avec __setitem__().

Je ne suis pas sûr si __getitem__() prend plusieurs arguments comme je montre ici, ou s'il prend un tuple, ou quoi. Je n'ai pas NumPy disponible que j'écris cette réponse, désolé.

EDIT: J'ai réécrit l'exemple pour utiliser super() au lieu d'appeler directement la classe de base. Cela fait longtemps que je n'ai rien fait avec le sous-classement en Python.

EDIT: Je viens de regarder la réponse acceptée. C'est totalement la façon de le faire. Je vais laisser cela en place au cas où quelqu'un le trouverait éducatif, mais la façon la plus simple est la meilleure.