Quelle est la différence entre les tableaux et les matrices?
Certaines personnes recherchent des solutions matricielles aux problèmes de réseau, alors quelle est la différence? La grande différence est que les valeurs de la matrice sont des nombres, un tableau peut contenir d'autres informations, même des chaînes. Les matrices peuvent représenter des équations, c'est là que la plupart des développeurs en ont besoin, au moins dans le cas du remplacement de NumPy.
Comment faire un calcul matriciel?
Les opérations matricielles standard sont simples à faire, lors de l'ajout, vous ajoutez simplement les éléments, lors de la multiplication, vous pouvez utiliser un scalaire pour chaque élément et ainsi de suite.
La multiplication est un peu plus complexe mais de très peu. Ce qui le rend lourd, c'est qu'il faut faire de nombreux calculs pour chaque solution, c'est là que la performance entre en jeu. Étant donné que la majorité des calculs ne dépendent pas les uns des autres, ces calculs sont d'excellents candidats pour le calcul parallèle. Les GPU sont conçus pour ces types de calculs et ils sont conçus pour être facilement ajoutés aux systèmes de bureau.
Lorsque vous devez effectuer des calculs matriciels en Python, la première solution que vous trouvez est numPy. Cependant NumPy n'est pas toujours le système le plus efficace pour calculer de nombreuses matrices.
Cet article couvrira les options que vous avez en Python.
Lorsque vous avez besoin d'alternatives, commencez par examiner plus attentivement ce pour quoi vous avez besoin d'opérations matricielles. Votre installation actuelle peut déjà avoir, soit sa propre implémentation, soit utilise une bibliothèque sous-jacente. Un exemple est l'apprentissage automatique, où le besoin d'opérations matricielles est primordial. TensorFlow possède sa propre bibliothèque pour les opérations matricielles. Assurez-vous de connaître votre bibliothèque actuelle.
Dans de nombreux cas cependant, vous avez besoin d'une solution qui fonctionne pour vous. Il y a peut-être des limitations dans NumPy, certaines bibliothèques sont plus rapides que NumPy et spécialement conçues pour les matrices. Plusieurs fois, les développeurs veulent accélérer leur code afin qu'ils commencent à chercher des alternatives. L'une des raisons est que NumPy ne peut pas fonctionner sur les GPU.
Bien que cet article traite des alternatives à NumPy, une bibliothèque construite sur NumPy, la bibliothèque Theano doit être mentionnée. La bibliothèque Theano est étroitement intégrée à NumPy et permet une matrice prise en charge par GPU. Theano est une plus grande bibliothèque pour l'apprentissage automatique, mais vous ne pouvez extraire que les fonctions matricielles.
Pour une explication plus détaillée de l'utilisation de Theano, consultez cette page : http://www.marekrei.com/blog/theano-tutorial/
SpPy est une bibliothèque spécifiquement pour les tableaux clairsemés, elle peut toujours être utilisée pour les matrices. Soit dit en passant, un tableau clairsemé est un tableau qui contient de nombreuses valeurs nulles. Cette bibliothèque est petite et efficace mais un peu limitée en raison de sa spécialisation. Il utilise également NumPy mais est plus efficace que NumPy.
https://pythonhosted.org/espion/
Eigen est une implémentation efficace de matrices, pour l'utiliser en Python, vous avez besoin de miniEigen, disponible sur https://pypi.org/pypi/minieigen. Eigen est en fait inclus dans de nombreuses autres solutions. Il agit comme la bibliothèque matricielle générique pour des modules et des frameworks plus spécialisés. Cette bibliothèque contient de nombreux modules pour la manipulation de matrices et de tableaux denses. Il prend également en charge l'algèbre linéaire, la décomposition et l'algèbre linéaire creuse. Le package a également une fonction de plugin pour que vous puissiez ajouter vos propres modules.
Pour utiliser Eigen, installez-le avec pip et importez-le dans votre code.
PyTorch est une bibliothèque pour l'apprentissage automatique, à cause de cela, il a des opérations matricielles. Importer toute la bibliothèque est exagéré si vous ne voulez faire que quelques calculs. Cependant, si vous débutez avec un projet d'apprentissage automatique, assurez-vous de décider si celui-ci est fait pour vous.
Une autre alternative consiste à récupérer n'importe quelle bibliothèque C et à l'utiliser. Pour rendre cela possible, il existe une solution nommée cffi qui créera l'interface pour vous. Cette solution nécessite que vous connaissiez déjà le C et que vous créiez un wrapper pour chaque fonction dont vous avez besoin. Le code aura alors l'air confus et difficile à lire mais cela peut valoir le coup selon votre projet.
Si vous voulez juste accélérer tous les tableaux et fonctions numériques, vous pouvez utiliser numba à la place. Numba est un compilateur Python. Lorsque vous l'utilisez, le compilateur créera du code binaire "juste à temps", jit. L'idée de jit est plus couramment utilisée avec Java mais est très utile pour les mathématiques lourdes en Python. Étant donné que Python est interprété, vous pouvez avoir des problèmes de performances avec les mathématiques lourdes, numba s'en occupe en compilant sur le processeur ou le processeur graphique de votre choix.
Des fonctionnalités de calcul parallèle sont également disponibles, par défaut le compilateur s'exécute avec un verrou qui empêche de nombreux threads de s'exécuter en même temps. Vous pouvez désactiver cela par un indicateur tant que vous êtes conscient des problèmes potentiels associés à la programmation parallèle.
Conclusion
Souvent, lorsque vous commencez à programmer en Python ou dans d'autres langages, vous rencontrez des limitations du langage, du compilateur ou d'autre chose. Lorsque vous êtes dans cette situation, vous devriez vous arrêter et réfléchir à vos limites et considérer combien d'autres personnes ont pu avoir la même situation. Dans le cas de Python et NumPy, de nombreux scientifiques et développeurs ont écrit du code qui nécessite une exécution rapide. Cet héritage a créé un grand nombre de branches qui peuvent résoudre votre problème sans vous obliger à changer de langue ou à écrire une nouvelle extension pour cette langue particulière.