During my years on Python development, I\'ve always been amazed at how much much much faster things become if you manage to rewrite that code that loops though your ndarray and
I'm developing PyExtJS see at
https://github.com/fernandezajp/PyExtJS
numjs is a numpy like library in nodejs.
I've not tried this, but I found node-lapack. Since Numpy gets most of it's speed from using blas/lapack to do everything, this should help. From the readme it looks like it has an array object too, which is essential to not convert between JS and lapack on every operation.
Here's a part of their demo:
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
It seems to be a pretty direct interface to lapack using the same names, so in that regard it's not as convenient as Numpy, but at least it takes care of array dimensions and stuff and should be about as fast (since most of the work is being done by Lapack in either case).
However, this won't work in a browser, which means everywhere where this is available, Python is probably also available. Personally I'd stick with Python, which is much more dominant for numerical stuff, unless there's some specific Node functionality Python is missing...
In the same spirit of @Julius's answer about deeplearn.js, tensorflow.js is the continuation of the same project. To play around with the tensorflow module in the REPL, I installed it globally (FYI - it is usually advised not to do this) using this:
$ npm install --global @tensorflow/tfjs
Then, I ran $ node
to start the node REPL.
This may differ for you (especially if you decided to install tensorflow locally), but I entered this to reference the tensorflow module:
var tf = require('/usr/local/lib/node_modules/@tensorflow/tfjs')
To create a rank 1 tensor (equivalent to a 1-D array in numpy), try:
var x = tf.tensor( [-3,4] )
And square it with:
x.square().print()
You should get [9,16]
for your output. See https://js.tensorflow.org for more details.
I would say that tensorflow.js is not only a JS replacement for numpy, but also for sklearn, keras, and of course, tensorflow.
No, there are no technical reasons why a numpy-like package does not exist for Node.js and, more generally, JavaScript.
There are two main obstacles preventing Node.js and JavaScript from achieving more mind share in the data science and numeric computing communities.
The first obstacle is community. While the JavaScript community is huge, the subset of people within that community doing interesting things in numeric computing is small. Hence, if you want to do numeric computing in JavaScript and Node.js, finding resources to help you along the way can be hard, and it may feel like a lonely endeavor.
Next, the absence of comparable libraries (chicken and egg: libraries are needed to attract library authors and authors are needed to write good libraries). There are no technical reasons why libraries cannot be written in JavaScript or leverage Node.js (e.g., via native add-ons). I know, as I have written many numeric computing libraries in JavaScript. So while numeric computing is possible in JavaScript, the problem stems from an inability to attract developers having sufficient expertise and capable of putting in the time and effort needed to write high quality numeric computing implementations.
Regarding the specific language features mentioned in the OP:
My personal belief is that some form of numeric computing is inevitable in JavaScript and Node.js. The advantages (ubiquity, distribution, performance) and potential applications (edge computing, integrating machine learning, data visualization) are too strong of evolutionary forces not to support data science applications, at least at a basic level.
disclosure: I and others are currently working on a project (https://github.com/stdlib-js/stdlib) which aims to provide numeric computing facilities in JavaScript and Node.js.
The majority of node work seems to be in the web "full stack" universe, with a lot less work being done in areas where fast numeric processing is an advantage.
In the areas where fast numeric processing is an advantage, Python, R, etc probably have a dominant mindshare.
Combine those two facts, and you end up with not a lot of people putting effort into node numeric processing libraries.