Au cours de mes années sur le développement de Python, j'ai toujours été étonné de voir à quel point les choses vont beaucoup plus vite si vous parvenez à réécrire ce code qui tourne en boucle dans votre ndarray et fait quelque chose, avec des fonctions numpy qui fonctionnent simultanément sur tout le tableau. Plus récemment, je me suis tourné de plus en plus vers un noeud et je recherche quelque chose de similaire. Jusqu'à présent, j'ai trouvé certaines choses dont aucune ne semble prometteuse:
Autant que je sache, npms peut être écrit en C++, alors je me demande pourquoi il n’existe pas de bibliothèques de type numpy pour node. N'y a-t-il simplement pas assez d'intérêt dans node pour la communauté qui a besoin de ce type de pouvoir? Peut-on espérer que les fonctionnalités de l'ES6 (compréhensions de liste) permettront aux compilateurs javascript de vectoriser automatiquement le code JS natif au format C++? Suis-je peut-être en train de rater autre chose?
Edit, en réponse aux votes serrés: Remarque, je ne demande pas "quel est le meilleur package pour faire xyz". Je me demande simplement s'il y a une raison technique, il n'y a pas de paquet pour le faire sur un nœud, pour une raison sociale, ou pas de raison du tout et il y a juste un paquet que j'ai raté. Peut-être pour éviter de trop nombreuses critiques, j'aimerais savoir: j'ai environ 10000 matrices de 100 x 100 chacune. Quel est le meilleur moyen (* correction, une rapidité raisonnable) de les additionner?
Edit2 Après quelques recherches supplémentaires, il s’est avéré que je cherchais la mauvaise chose sur Google. Google pour "node.js scientific computing" et des liens vers des notes très intéressantes:
En gros, pour autant que je sache, personne ne s’est inquiété jusqu’à présent. De plus, étant donné que js TypedArrays comporte des omissions majeures (telles que les ints 64 bits), il peut être difficile d’ajouter un bon support en utilisant simplement des NPM et en ne piratant pas le moteur lui-même, ce qui irait à l’encontre du but recherché. Là encore, je n'ai pas approfondi mes recherches sur cette dernière affirmation.
Non, il n'y a pas de raison technique pour laquelle un paquet de type numpy n'existe pas pour Node.js et, plus généralement, pour JavaScript.
Deux obstacles principaux empêchent Node.js et JavaScript d’accroître la part d’esprit dans les communautés de la science des données et de l’informatique numérique.
Le premier obstacle est la communauté. Alors que la communauté JavaScript est énorme, le sous-ensemble de personnes faisant des choses intéressantes dans l'informatique numérique est peu nombreux. Par conséquent, si vous souhaitez utiliser l'informatique numérique en JavaScript et dans Node.js, il peut être difficile de trouver des ressources pour vous aider tout au long du processus, ce qui peut vous sembler être une entreprise solitaire.
Ensuite, l’absence de bibliothèques comparables (poulet et œuf: des bibliothèques sont nécessaires pour attirer des auteurs de bibliothèque et des auteurs pour écrire de bonnes bibliothèques). Il n'y a pas de raisons techniques pour lesquelles les bibliothèques ne peuvent pas être écrites en JavaScript ou tirer parti de Node.js (par exemple, via des add-ons natifs). Je sais, comme j’ai écrit de nombreuses bibliothèques de calcul numérique en JavaScript. Ainsi, alors que l'informatique numérique est possible en JavaScript, le problème provient de l'incapacité d'attirer des développeurs possédant une expertise suffisante et capables de consacrer le temps et les efforts nécessaires à la rédaction d'implémentations informatiques numériques de haute qualité.
En ce qui concerne les fonctionnalités linguistiques mentionnées dans le PO:
Ma conviction personnelle est qu’une certaine forme d’informatique numérique est inévitable dans JavaScript et Node.js. Les avantages (omniprésence, distribution, performance) et les applications potentielles (Edge Computing, intégration de l’apprentissage automatique, visualisation de données) sont trop puissants pour ne pas prendre en charge les applications informatiques, du moins au niveau de base.
divulgation: moi-même et d'autres personnes travaillons actuellement sur un projet ( https://github.com/stdlib-js/stdlib ) qui vise à fournir des installations informatiques numériques en JavaScript et en Node.js.
Je n'ai pas essayé cela, mais j'ai trouvé node-lapack . Puisque Numpy tire le meilleur parti de sa rapidité en utilisant blas/lapack pour tout faire, cela devrait aider. D'après le fichier readme, il semble également qu'il y ait un objet tableau, ce qui est essentiel pour ne pas convertir entre JS et lapack à chaque opération.
Voici une partie de leur démo:
var lapack = require('lapack');
var result = lapack.sgeqrf([
[1, 2, 3],
[3, 4, 5],
[5, 6, 7]
]);
console.log(result.R);
console.log(result.tau);
result = sgesvd('A', 'A', [
[1, 2, 3],
[3, 4, 5],
[5, 6, 7]
]);
console.log(result.U);
console.log(result.S);
console.log(result.VT);
result = lapack.sgetrf([
[1, 2, 3],
[3, 4, 5],
[5, 6, 7]
]);
// see the readme for more
Cela semble être une interface assez directe pour lapack qui utilise les mêmes noms. Ce n'est donc pas aussi pratique que Numpy, mais au moins, il prend en charge les dimensions des tableaux et tout le reste. Lapack dans les deux cas).
Cependant, cela ne fonctionnera pas dans un navigateur, ce qui signifie que partout où il est disponible, Python est probablement également disponible. Personnellement, je me contenterais de Python, qui est beaucoup plus dominant pour les tâches numériques, à moins qu’il n’y ait une fonctionnalité de nœud spécifique qui manque à Python ...
Voici le fichier TensorFlow.js de Google (qui s'appelait précédemment https://deeplearnjs.org ), qui fait exactement cela et possède des capacités intégrées pour former des réseaux de neurones profonds sur des GPU utilisant WebGL. Vous pouvez également porter les modèles TensorFlow .
Ne soyez pas dupe en pensant que c'est seulement pour l'apprentissage en profondeur. Il s’agit d’une plate-forme informatique numérique à part entière avec accélération GPU intégrée. Il suit le modèle "exécuter au fur et à mesure", comme NumPy (et Tensorflow Eager, et PyTorch, et autres), et non le modèle "définir puis exécuter" comme Tensorflow. En tant que tel, il semblera naturel de l'utiliser à quiconque a déjà utilisé NumPy auparavant.
Voici le repo très informatif Github:
https://github.com/tensorflow/tfjs-core (l'ancien lien https://github.com/PAIR-code/deeplearnjs y redirige maintenant)
La majorité du travail des noeuds semble être dans l'univers "full stack" du Web, avec beaucoup moins de travail dans les zones où le traitement numérique rapide est un avantage.
Dans les régions où le traitement numérique rapide est un avantage, Python, R, etc. ont probablement une mentalité dominante.
Combinez ces deux faits et vous vous retrouverez avec peu de gens investis dans des bibliothèques de traitement numérique de nœuds.
Je développe PyExtJS voir à
Dans le même esprit que @ Julius dans sa réponse à propos de deeplearn.js, tensorflow.js est la continuation du même projet. Pour jouer avec le module tensorflow dans le REPL, je l'ai installé globalement (pour info - il est généralement déconseillé de le faire) en utilisant ceci:
$ npm install --global @tensorflow/tfjs
Ensuite, j'ai exécuté $ node
pour démarrer le nœud REPL.
Cela peut différer pour vous (surtout si vous avez décidé d’installer localement tensorflow), mais j’ai saisi ceci pour faire référence au module tensorflow:
var tf = require('/usr/local/lib/node_modules/@tensorflow/tfjs')
Pour créer un tenseur de rang 1 (équivalent à un tableau 1-D dans numpy), essayez:
var x = tf.tensor( [-3,4] )
Et placez-le avec:
x.square().print()
Vous devriez obtenir [9,16]
pour votre sortie. Voir https://js.tensorflow.org pour plus de détails.
Je dirais que tensorflow.js n’est pas seulement un remplacement de JS pour numpy, mais également pour sklearn, keras et bien sûr, tensorflow.