Question

Je cherche à créer une matrice 2D d’entiers à adressage symétrique (c’est-à-dire que matrice [2,3] et matrice [3,2] renverront la même valeur) en python. Les nombres entiers seront additionnés et soustraits et utilisés pour des comparaisons logiques. Mon idée de départ était de créer les objets entiers à l’avance et d’essayer de remplir une liste de listes avec un équivalent python de pointeurs. Je ne sais pas comment faire, cependant. Quelle est la meilleure façon de mettre cela en œuvre et devrais-je utiliser des listes ou une autre structure de données?

Était-ce utile?

La solution

Une méthode plus simple et plus propre consiste à utiliser un dictionnaire avec des nuplets triés comme clés. Les n-uplets correspondent à votre index matriciel. Remplacez __ getitem __ et __ setitem __ pour accéder au dictionnaire par des nuplets triés; voici un exemple de classe:

class Matrix(dict):
    def __getitem__(self, index):
        return super(Matrix, self).__getitem__(tuple(sorted(index)))
    def __setitem__(self, index, value):
        return super(Matrix, self).__setitem__(tuple(sorted(index)), value)

Et utilisez-le comme ceci:

>>> matrix = Matrix()
>>> matrix[2,3] = 1066
>>> print matrix
{(2, 3): 1066}
>>> matrix[2,3]
1066
>>> matrix[3,2]
1066
>>> matrix[1,1]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "z.py", line 3, in __getitem__
    return super(Matrix, self).__getitem__(tuple(sorted(index)))
KeyError: (1, 1)

Autres conseils

Les "calculs matriciels" de Golub et Van Loan livre décrit un schéma d'adressage possible:

Vous emballez les données dans un vecteur et y accédez comme suit, en supposant que i > = j:

a_ij = A.vec((j-1)n - j(j-1)/2 + i)    

Vous feriez probablement mieux d'utiliser une matrice carrée numpy. Oui, cela gaspille la moitié de la mémoire en stockant des valeurs redondantes, mais le fait de lancer votre propre matrice symétrique en Python gaspille encore plus de mémoire et de CPU en stockant et en traitant les entiers sous forme d'objets Python.

Il vous suffit de stocker le triangle inférieur de la matrice. Cela se fait généralement avec une liste de longueur n (n + 1) / 2. Vous devrez surcharger la méthode __ getitem __ pour interpréter le sens de l'entrée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top