> Modules non standards > numpy > Création des arrays
Création des arrays
numpy arrays :
- beaucoup d'opérations sont implémentées de façon compilée (performant en vitesse).
- ont une taille fixée à la création une fois pour toutes.
- tous les éléments d'un array doivent être du même type.
- occupent en mémoire la même taille qu'en C (performant en mémoire)
Les types
Types disponibles sous numpy :
- numpy.bool
- numpy.int (int32 ou int64 selon l'OS de la machine)
- numpy.int8
- numpy.int16
- numpy.int32
- numpy.int64
- numpy.uint8
- numpy.uint16
- numpy.uint32
- numpy.uint64
- numpy.float (ou numpy.float64)
- numpy.float16
- numpy.float32
- numpy.complex (ou numpy.complex128)
- numpy.complex64
numpy.nan : valeur non définie (attention,
numpy.nan == numpy.nan est False).
On peut aussi exprimer les types de cette façon :
- numpy.dtype('i4') : entier signé sur 4 octets.
- numpy.dtype('u4') : entier non signé sur 4 octets.
- numpy.dtype('f8') : flottant sur 8 octets.
- numpy.dtype('b') : booléen.
- numpy.dtype('S4') : strings jusqu'à 4 caractères.
Création des arrays
Création d'une array simple :
- a = numpy.array([1, 2, 3.5]) : à partir d'une liste python, et python détermine lui-même le type de l'array créée.
- a = numpy.array((1, 2, 3.5)) : on peut aussi le faire à partir d'un tuple.
- a = numpy.int_([1, 2, 3.5]) : à partir d'une liste python, mais en imposant un type (pareil avec float_ et bool_)
- pour connaître le type d'une array : a.dtype
- accès à un élément : a[0]. Donne un scalaire du même type que le type de l'array, donc souvent un type numpy. Attention, si on veut un type python, il faut le convertir : int(a[0]) par exemple.
- si on fait b = numpy.array(a), b est une copie de a (si a changé, b ne l'est pas).
- si on fait b = numpy.asarray(a), b pointe vers la même array que a (si a modifiée, b l'est aussi).
- numpy.copy(a) : renvoie une copie de l'array (indépendante de l'array de départ).
- conversion de type : a = numpy.array([1, 2], dtype = float); b = a.astype(numpy.int) (ou même a.astype(int)). Dans le cas de conversion de float en int, on récupère la valeur avant la virgule (par d'arrondissement, et ce n'est pas non plus la partie entière au sens mathématique).
- si pour une array de type int, on fait ar[0, 3] = 3.7, c'est la valeur 3 qui est stockée (le type de l'array est définitif).
Création d'une array à plusieurs dimensions :
- on peut aussi créer une array à deux dimensions à partir d'une liste de listes : numpy.array([[1, 2, 3], [4, 5, 6]]).
- pour une array 2d, les valeurs sont par lignes :
array([[1, 2, 3],
[4, 5, 6]])
- accès aux éléments : index de ligne, puis index de colonne. Par exemple a[0, 1] donne ici 2.
- a.shape : renvoie les dimensions de l'array, d'abord le nombre de lignes, puis le nombre de colonnes, ici (2, 3).
- s.size : donne la taille totale d'une array numpy (le produit des tailles des differentes dimensions).
Création d'arrays prédéterminées :
- a = numpy.zeros((2, 3), dtype = int); a : création d'une array 2 x 3 avec que des zéros. Si type non précisé, c'est float.
- b = numpy.zeros_like(a) : création d'une array de même taille et type que celle donnée, et avec que des zéros.
- b = numpy.zeros_like(a, dtype = float) : l'array est de même taille, mais on impose un type.
- sous linux, quand on crée une array numpy avec des zéros, la mémoire virtuelle augmente, mais pas la mémoire résidente ! Ce n'est qu'au remplissage de l'array que la mémoire résidente augmente.
- ones, ones_like : comme zeros et zeros_like, mais remplit avec des 1 plutôt qu'avec des 0.
- numpy.tril(numpy.ones(values.size))) : matrice triangulaire inférieure basée sur la matrice de 1 donnée (pareil avec triup pour la matrice triangulaire supérieure)
- a = numpy.empty((2, 3), dtype = float) : création d'une array 2x 3 de floats non initialisée. Attention, les valeurs sont non prédictibles (ce qu'il y a dans la mémoire à ce moment-là. Il y a aussi un empty_like.
- numpy.identity(3) : la matrice identité (en float par défaut, sinon préciser dtype : numpy.identity(3, dtype = int).
- numpy.eye(3, 2) : matrice 3 x 2 avec des 1 sur la diagonale et des 0 ailleurs, en float par défaut (sinon, utiliser dtype pour préciser le type).
- numpy.eye permet aussi de faire des diagonales autre que la diagonale principale : numpy.eye(3, 3, 1) donne :
array([[ 0., 1., 0.],
[ 0., 0., 1.],
[ 0., 0., 0.]])
avec numpy.eye(3, 3, -1), on aurait la sous-diagonale, avec numpy.eye(3, 3, 2), on aurait un 1 en haut à droite.
- numpy.diag(numpy.array([1, 4])) : crée une matrice diagonale avec la diagonale indiquée :
array([[1, 0],
[0, 4]])
- réciproquement, on peut extraire la diagonale d'une matrice 2d : numpy.diag(numpy.array([[1, 2], [3, 4]])) donne array([1, 4]).
- numpy.tril(numpy.array([[1, 2], [3, 4]])) matrice triangulaire inférieure d'une array 2d, donc ici :
array([[1, 2],
[0, 4]])
(idem avec triu pour la matrice triangulaire supérieure).
On peut faire des opérations sur les arrays et elles sont implémentée en C :
- a = numpy.int_([1, 2, 3, 4]); b = numpy.int_([-1, -2, -3, -4]); a + b; a * b
- les deux variables doivent être de même dimension ou du moins de dimensions compatibles, sinon il y a erreur.
- on peut faire ça : numpy.array([1, 2, 3]) + 0.1, ça donne array([1.1, 2.1, 3.1])
Lecture et écriture.
Lecture à partir d'un fichier ou d'un flux quelconque :
- numpy.genfromtxt(StringIO.StringIO('12\t3.4\n56\t7.8\n')) : lit le flux et le transforme en array 2d.
- on peut préciser le délimiteur : numpy.genfromtxt(StringIO.StringIO('12,3.4\n56,7.8\n'), delimiter = ',') (par défaut, les espaces, incluant les tabulations).
- si les colonnes ont une largeur fixe plutôt qu'un délimiteur, faire delimiter = (4, 6, 5) en donnant la largeur de chaque colonne.
- autostrip = True : permet de retirer automatiquement les blancs de chaque champ.
- comments = '#' : indique que tout ce qui est après '#' est un commentaire à ignorer (c'est le caractère par défaut)
- skip_header = 1 : saute la première ligne (défaut est à 0).
- skip_footer = 3 : saute les 3 dernières lignes (défaut est à 0).
- usecols = (0, 3, 4) : indique de n'importer que les colonnes 0, 3 et 4.
- pour indiquer le type et/ou le nom des colonnes :
- a = numpy.genfromtxt(StringIO.StringIO('12\t34\n56\t78\n'), dtype = int) : que des types entier (défaut est float).
- a = numpy.genfromtxt(StringIO.StringIO('12\t34\n56\t78\n'), names = 'A, B') : attribue des noms. On peut alors retrouver ces noms par a.dtype.names et surtout accéder à la colonne correspondant à un nom par a['A']
Ecriture dans un fichier :
- pour sauver une matrice dans un fichier : numpy.savetxt('myFile.csv', matrix, fmt = '%.1f', delimiter = '\t')
- pour sauvegarder une matrice numpy d'entiers : numpy.savetxt('toto.csv', ar, fmt = '%d', delimiter = '\t')
Impression d'une arrray numpy : numpy.set_printoptions permet de gouverner comment les array numpy s'impriment :
- numpy.set_printoptions(threshold = 1000, edgeitems = 3) : à partir de 1000 items (lignes ou colonnes), on imprime plus que les 3 premiers et 3 derniers. C'est le défaut.
- numpy.set_printoptions(linewidth = 100) : la largeur des lignes (défaut est 75).
- numpy.set_printoptions(precision = 2) : 2 chiffres après la virgule (défaut est 8).
Divers.
matrix :
- ancienne classe qui ne devrait plus être utilisée et représente une matrice 2d. Utiliser plutôt les ndarrays (numpy.array)
- mat = numpy.matrix([[1, 2], [3, 4]]) : création d'un objet
- numpy.asarray(mat) : conversion d'une matrice en array numpy (ndarray).
Arrays de records :
- création d'une array avec 2 records, comportant chacun 3 champs : un entier, un float et une string d'au plus 10 caractères :
x = numpy.zeros((2,), dtype=('i4,f4,a10'))
- remplissage : x[0] = (3, 5.6, 'abcdefgh') (si la string est trop longue, elle est coupée).
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert