在我开发Python的过程中,如果你设法重写那些通过你的ndarray循环并执行某些操作的代码,我总是惊讶于事情会变得多快多少,整个函数都可以工作的numpy函数阵列一下子。最近我越来越多地转向节点,我正在寻找类似的东西。到目前为止,我已经提出了一些看法很有希望的事情:
据我所知,npms可以用C ++编写,所以我想知道为什么节点没有类似numpy的库。对于那些需要这种力量的社区,是否对节点没有足够的兴趣?是否有希望ES6功能(列表推导)将允许javascript编译器自动将原生JS代码矢量化为C ++速度?我可能错过了其他的东西吗?
编辑,以回应关闭投票:注意,我并没有要求"做xyz"的最佳套餐是什么?我只是想知道是否存在技术上的原因,在节点上没有包这么做,这是一个社会原因,或者根本就没有理由,而且我只错过了一个包。也许为了避免太多自以为是的批评,我想知道:我有大约10000个矩阵,每个100 x 100。什么是最好的(*校正,合理的快速)方式将它们加在一起?
EDIT2 经过一番挖掘,结果发现我正在谷歌搜索错误的东西。谷歌为" node.js科学计算"并且链接到一些非常有趣的笔记:
基本上据我所知,到目前为止还没有人打扰过。此外,由于js TypedArrays中存在一些重大遗漏(例如64位整数),因此仅使用NPM可能很难增加良好的支持,而不是破坏引擎本身 - 这会破坏目的。再说一遍,我没有进一步研究这最后的陈述。
答案 0 :(得分:21)
不,没有技术原因可以解释为什么Node.js不存在类似numpy的包,更常见的是JavaScript。
阻止Node.js和JavaScript在数据科学和数字计算社区中实现更多思想共享有两个主要障碍。
第一个障碍是社区。虽然JavaScript社区很庞大,但该社区中人们在数字计算中做有趣事情的人很少。因此,如果你想在JavaScript和Node.js中进行数值计算,找到资源来帮助你一路走来可能很难,而且它可能感觉像是一种孤独的努力。
接下来,缺少可比较的库(鸡和鸡蛋:需要库来吸引图书馆作者和作者才能编写好的库)。没有技术原因可以解释为什么库不能用JavaScript编写或利用Node.js(例如,通过本机附加组件)。我知道,因为我在JavaScript中编写了许多数字计算库。因此,虽然JavaScript中的数字计算是可能的,但问题源于无法吸引具有足够专业知识且能够投入编写高质量数字计算实现所需的时间和精力的开发人员。
关于OP中提到的特定语言功能:
我个人认为,JavaScript和Node.js中某种形式的数值计算是不可避免的。优势(普遍性,分布,性能)和潜在应用(边缘计算,集成机器学习,数据可视化)过于强大,无法支持数据科学应用,至少在基础层面上是这样。
披露:我和其他人正在开发一个项目(https://github.com/stdlib-js/stdlib),旨在提供JavaScript和Node.js中的数字计算工具。
答案 1 :(得分:8)
以下是Google的TensorFlow.js(之前的https://deeplearnjs.org),它正是如此,并且已经建立了使用WebGL在GPU上训练深度神经网络的能力。您还可以port TensorFlow models to it。
不要以为这只是为了深度学习而被愚弄。它是一个完全成熟的数字计算平台,内置GPU加速功能。它紧跟着你的热切"执行'#34;模型,如NumPy(和Tensorflow Eager,和PyTorch等),而不是"定义然后运行"像Tensorflow这样的模型。因此,对于之前使用过NumPy的人来说,使用它会很自然。这是非常有用的Github回购:
https://github.com/tensorflow/tfjs-core(旧链接https://github.com/PAIR-code/deeplearnjs现在重定向到那里)
答案 2 :(得分:6)
我没试过,但我发现了node-lapack。由于Numpy通过使用blas / lapack来完成所有事情的速度,所以这应该有所帮助。从自述文件看,它看起来也有一个数组对象,这对于在每次操作时都不能在JS和lapack之间进行转换是必不可少的。
以下是他们演示的一部分:
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
它似乎是一个非常直接的界面使用相同的名称lapack,所以在这方面,它不像Numpy那样方便,但至少它需要处理数组维度和东西,并且应该快得多(因为大多数在任何一种情况下,Lapack都在完成这项工作。)
但是,这在浏览器中不起作用,这意味着在任何可用的地方都可以使用Python。就个人而言,我坚持使用Python,这对于数字化的东西更为重要,除非有一些特定的Node功能缺少Python ......
答案 3 :(得分:4)
大多数节点工作似乎都在网络“完整堆栈”领域,在快速数字处理有利的领域完成的工作少得多。
在快速数字处理有利的领域,Python,R等可能占据主导地位。
结合这两个事实,你最终没有很多人投入到节点数字处理库中。
答案 4 :(得分:2)
我正在开发PyExtJS,请参阅
答案 5 :(得分:1)
numjs是nodejs中的一个类似numpy的库。
答案 6 :(得分:0)
与@ Julius关于deeplearn.js的答案一样,tensorflow.js是同一个项目的延续。为了解决REPL中的tensorflow模块,我在全球范围内安装它(仅供参考 - 通常建议不要这样做):
wkb2
然后,我运行$ npm install --global @tensorflow/tfjs
以启动节点REPL。
这可能与您有所不同(特别是如果您决定在本地安装tensorflow),但我输入此参考tensorflow模块:
$ node
要创建一个等级1张量(相当于numpy中的一维数组),请尝试:
var tf = require('/usr/local/lib/node_modules/@tensorflow/tfjs')
并将其与:
对齐var x = tf.tensor( [-3,4] )
您的输出应该为x.square().print()
。有关详细信息,请参阅https://js.tensorflow.org。
我想说tensorflow.js不仅是numpy的JS替代品,也是sklearn,keras,当然还有tensorflow的替代品。
答案 7 :(得分:0)
我开始https://www.npmjs.com/package/@nexys/math-ts一个非常简单轻便的数字打字稿库/程序包
答案 8 :(得分:0)
scijs的ndarray也很好。 link
var mat = ndarray(new Float64Array([1, 0, 0, 1]), [2,2])
//Now:
//
// mat = 1 0
// 0 1
//