Python >> Tutoriel Python >  >> Python Tag >> NumPy

Comment créer un dictionnaire à partir de deux tableaux NumPy ?

Toute personne travaillant avec des listes de données rencontrera le besoin de les combiner de manière utile. Souvent, le meilleur résultat est un dictionnaire composé de clés et valeurs . Dans cet article, vous apprendrez à créer un dictionnaire à partir de deux tableaux NumPy.

Formulation du problème : Étant donné deux tableaux NumPy a et b . Créer un dictionnaire qui attribue la clé a[i] à la valeur b[i] pour tous les i .

Exemple :Étant donné deux tableaux NumPy

a = np.array([1, 42, 0])
b = np.array(['Alice', 'Bob', 'Liz'])

Créez un nouveau dictionnaire par programme qui attribue les éléments dans a aux éléments en b , élément par élément :

{1: 'Alice',
 42: 'Bob',
 0: 'Liz'}

Après vous avoir fourni quelques informations sur le tableau NumPy d'entrée, vous apprendrez plusieurs méthodes pour y parvenir.

Contexte :NumPy pour le tableau

NumPy est une bibliothèque Python utile pour travailler avec des tableaux. NumPy signifie 'Python numérique' . Les utilisateurs de Python peuvent utiliser des listes standard comme tableaux, mais NumPy fonctionne plus rapidement car les éléments du tableau sont stockés dans une mémoire contiguë. Cela le rend plus efficace, par exemple, pour parcourir le tableau plutôt que d'avoir à parcourir l'espace mémoire pour trouver l'élément suivant.

Si Python et PIP sont déjà installés sur nos systèmes, l'installation de NumPy est simple :

Créer un tableau NumPy est aussi simple que d'importer la bibliothèque NumPy et d'appeler le array() fonction. NumPy est souvent importé sous le np alias :

import numpy as np	
planet = np.array(['Mercury', 'Venus', 'Earth', 'Mars'])
orbitalPeriod = np.array([88.0, 224.7, 365.2, 687.0])

Contrairement aux listes standard de Python, qui peuvent contenir différents types de données dans une seule liste, les tableaux de NumPy doivent être homogènes, tous du même type de données. Sinon, nous perdons l'efficacité mathématique intégrée à un tableau NumPy.

Méthode 1 :Zippez-les

Après avoir créé deux tableaux, nous pouvons ensuite utiliser le zip() de Python fonction pour les fusionner dans un dictionnaire. Le zip() module est dans l'espace de noms intégré de Python. Si nous utilisons dir() pour afficher __builtins__ on trouve zip() en fin de liste :

>>>dir(__builtins__)
['ArithmeticError', 'AssertionError'...,'vars', 'zip']

Le zip() La fonction crée un itérateur qui fusionne les éléments de chacun des tableaux itérables, tout comme les dents imbriquées d'une fermeture à glissière sur une paire de jeans. En fait, le zip() fonction a été nommée pour une fermeture éclair physique.

d = {}
for A, B in zip(planet, orbitalPeriod):
    d[A] = B

print(d)
# {'Mercury': 88.0, 'Venus': 224.7, 'Earth': 365.2, 'Mars': 687.0}

Lors de l'utilisation du zip() fonction, nous sommes assurés que les éléments resteront dans l'ordre donné de gauche à droite. Pas besoin de s'inquiéter que les éléments des tableaux soient mélangés lorsqu'ils sont combinés dans le dictionnaire. Sinon, le dictionnaire serait inutile, car les clés ne s'aligneraient pas correctement sur leurs valeurs.

Méthode 2 :Tableaux de longueurs inégales

Dans certains cas, nos tableaux peuvent être de longueurs inégales, ce qui signifie qu'un tableau a plus d'éléments que l'autre. Si oui, alors en utilisant le zip() la fonction pour les fusionner se traduira par le dictionnaire correspondant au plus court longueur du tableau. Voici un exemple des étoiles les plus brillantes de l'amas des Pléiades avec leurs magnitudes apparentes :

stars = np.array(['Alcyone', 'Atlas', 'Electra',
                  'Maia', 'Merope', 'Taygeta', 'Pleione'])
magnitude = np.array([2.86, 3.62, 3.70, 3.86, 4.17, 4.29])
	
cluster = {}

for A, B in zip(stars, magnitude):
    cluster[A] = B
	
print(cluster)
# {'Alcyone': 2.86, 'Atlas': 3.62, 'Electra': 3.7, 'Maia': 3.86, 'Merope': 4.17, 'Taygeta': 4.29}

Comme nous pouvons le voir, le 'stars ' contenait les Sept Sœurs, les sept étoiles les plus brillantes de l'amas des Pléiades. Le ‘magnitude ' array, cependant, ne répertorie que les six premiers valeurs de magnitude apparente. Lorsque le zip() fonction a fusionné les deux tableaux, la septième étoile a été entièrement supprimée.

Selon nos besoins, cela peut être acceptable. Mais sinon, nous pouvons utiliser le zip_longest() fonction du itertools module au lieu du zip() fonction. Avec cette fonction, toutes les valeurs manquantes seront remplacées par le fillvalue dispute. Nous pouvons insérer n'importe quelle valeur que nous voulons, et la valeur par défaut sera None .

Créons le cluster dictionnaire à nouveau :

from itertools import zip_longest

cluster = {}

for A, B in zip_longest(stars, magnitude, fillvalue='?'):
    cluster[A] = B

print(cluster)
# {'Alcyone': 2.86, 'Atlas': 3.62, 'Electra': 3.7, 'Maia': 3.86, 'Merope': 4.17, 'Taygeta': 4.29, 'Pleione': '?'}

Cette fois, toutes les Seven Sisters sont répertoriées, et la dernière valeur de magnitude inconnue est marquée d'un point d'interrogation, peut-être à remplir plus tard.

En combinant les tableaux économes en mémoire de NumPy avec le zip() ou zip_longest() la facilité d'utilisation des fonctions en tant qu'itérateur, nous pouvons créer rapidement et simplement des dictionnaires à partir de deux tableaux avec un minimum de tracas.

Références

  • [1] NumPy :https://numpy.org/
  • [2] PIP :https://pypi.org/project/pip/
  • [3] Périodes orbitales planétaires :https://nssdc.gsfc.nasa.gov/planetary/factsheet/
  • [4] zip() https://docs.python.org/3/library/functions.html#zip
  • [4] intégrés :https://docs.python.org/3/library/builtins.html
  • [6] L'amas des Pléiades :https://en.wikipedia.org/wiki/Pleiades
  • [7] zip_longest() :https://docs.python.org/3.3/library/itertools.html#itertools.zip_longest
  • [8] StackOverflow :https://stackoverflow.com/questions/52207358/create-dictionary-from-two-numpy-arrays

Prochain article