Les Matrices en Python
Hier, j'ai eu le besoin de une matrice de type Python.
Apparemment, une simple réponse à ce besoin serait d'utiliser numpy.matrix()
, mais l'autre problème que j'ai est que je voudrais une matrice de stocker des valeurs arbitraires avec un mélange de types, de même pour une liste. numpy.matrix
ne pas effectuer cette. Un exemple est
>>> numpy.matrix([[1,2,3],[4,"5",6]])
matrix([['1', '2', '3'],
['4', '5', '6']],
dtype='|S4')
>>> numpy.matrix([[1,2,3],[4,5,6]])
matrix([[1, 2, 3],
[4, 5, 6]])
Comme vous pouvez le voir, le numpy.matrix
doit être homogène dans le contenu. Si une valeur de chaîne est présente dans ma initialisation, chaque valeur est implicitement stockées sous forme de chaîne. Ceci est également confirmé par l'accès à la seule les valeurs
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,1]
'5'
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,2]
'6'
Maintenant, la liste Python de type peut, au lieu d'accepter les types mixtes. Vous pouvez avoir une liste contenant un entier et une chaîne de caractères, à la fois la conservation de leur type. Ce que j'ai besoin est quelque chose de semblable à une liste, mais travaillant dans une matrice comme comportement.
Par conséquent, j'ai dû mettre en place mon propre type. J'avais deux choix pour la mise en œuvre interne: liste contenant les listes et les dictionnaires. Les deux solutions présentent des défauts:
- liste de listes nécessite une synchronisation des différentes listes de tailles. La permutation de deux lignes est facile. La permutation de deux colonnes est moins facile. La suppression d'une ligne est facile.
- dictionnaires (avec un n-uplet comme une clé) sont un peu mieux, mais vous devez définir les limites de votre clé (par exemple, vous ne pouvez pas insérer l'élément de 5,5 si votre matrice 3x3), et ils sont plus complexes à utiliser pour insérer, supprimer, ou de swap de colonnes ou de lignes.
Edit: précisions. La raison concrète sur pourquoi j'ai besoin de cette fonctionnalité est parce que je suis de la lecture de fichiers CSV. Une fois que je collectionne les valeurs à partir d'un fichier CSV (valeurs qui peuvent être chaîne de caractères, des entiers, des flottants) je voudrais effectuer l'échange, de suppression, d'insertion et d'autres opérations semblables. Pour cette raison, j'ai besoin d'une "matrice de liste".
Mes curiosités sont:
- savez-vous si un Python de type de données de la fourniture de ce service existe déjà (peut-être dans un "non-batterie incluse" bibliothèque)?
- pourquoi est ce type de données ne figurent pas dans la bibliothèque standard? Trop restreint d'intérêt peut-être?
- Comment vous avez résolu ce besoin? Dictionnaire, une liste ou une autre solution plus intelligente?
OriginalL'auteur Stefano Borini | 2009-04-04
Vous devez vous connecter pour publier un commentaire.
Vous pouvez avoir inhomogène types si votre
dtype
estobject
:Je n'ai aucune idée à quoi bon, cela ne vous autre que la fantaisie de l'indexation, parce que, comme Ne l'a souligné, vous ne pouvez pas faire des maths avec cette matrice.
OriginalL'auteur Autoplectic
Je suis curieux de savoir pourquoi vous voulez cette fonctionnalité; si je comprends bien, la raison d'être des matrices (numpy), est principalement pour faire des linéaires mathématiques (transformations de matrice et ainsi de suite).
Je ne suis pas sûr de ce que la définition mathématique serait le produit d'un nombre décimal et d'une Chaîne.
En interne, vous aurez probablement envie de regarder sparse matrix implémentations (http://www.inf.ethz.ch/personal/arbenz/pycon03_contrib.pdf). Il y a beaucoup de façons de le faire (hachage, de liste, de liste chaînée), et chacun a ses propres avantages et inconvénients. Si votre matrice ne va pas avoir beaucoup de zéros ou des zéros, alors tu peux laisser tomber les rares implémentations.
Vous n'êtes pas en décrivant une sorte de "matrice". Vous décrivez une liste de tuples.
Oui, il est. Mais malheureusement, je veux être en mesure d'effectuer des opérations sur cette liste de tuples, semblables à des opérations de je le ferais sur une matrice: permutation de lignes, la permutation de colonnes, de l'insertion/suppression de colonnes, etc...
juste parce qu'un objet matrix arrive à avoir des méthodes pour swap/insérer/supprimer des lignes et des colonnes ne veut pas dire que c'est la structure de données que vous devez utiliser. Les Matrices sont pour les choses que vous pouvez multiplier, additionner, soustraire, exponentiate, calculer les valeurs propres et les vecteurs propres de l', etc.
une matrice mathématique oui. Je suis d'accord. Mais ce n'est pas une matrice mathématique. C'est plus d'une table. Donc, je dirais que j'ai utilisé le mot "matrice" dans son sens général, plutôt que de mathématiques.
OriginalL'auteur Don Werve
Avez-vous regardé le numpy.recarray capacités?
Par exemple ici:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.recarray.html
Il est conçu pour permettre à des tableaux avec un mélange de types de données.
Je ne sais pas si un tableau permettra de répondre à vos besoins, ou si vous avez vraiment besoin d'une matrice - je n'ai pas travaillé avec le numpy matrices. Mais si un tableau est assez bon, recarray pourrait fonctionner.
Je dirais que c'est la permutation de lignes et de colonnes est nécessaire, un tableau est simple, pas la bonne structure de données. Vous avez besoin de chaque élément à être indépendants les uns des autres.
OriginalL'auteur
C'est peut-être une réponse tardive,
mais,
pourquoi ne pas utiliser les pandas?
OriginalL'auteur ifmihai
Découvrez sympy-c'est tout à fait un bon travail au polymorphisme
dans ses matrices et opérations sur les sympy.les matrices.La matrice
des objets comme des col_swap, col_insert, col_del, etc...
OriginalL'auteur ivan
Avez-vous considéré comme le csv module pour travailler avec des fichiers csv?
Python docs pour csv module
OriginalL'auteur saffsd