节点类似numpy的包

在我开发Python的几年中,如果你设法重写通过你的ndarray执行代码并执行某些操作的代码,那么一旦在整个数组上工作的numpy函数,我总是惊讶于事情会变得多快。 最近我越来越多地转向节点,我正在寻找类似的东西。 到目前为止,我已经发现了一些东西,没有一个看起来很有希望:

  • scikit-node ,在Python中运行scikit-learn,并与节点连接。 我没有尝试过,但我不期望它能给我带来我想要的最高速度。
  • 有一些相当老,更新的JavaScriptmatrix库( sylvester , gl-matrix ,…)。 除了不确定它们是否适用于大于4×4的matrix(这在3D渲染中最有用),它们似乎是原生的JavaScript(有些不确定这些是否使用了webGL加速)。 伟大的浏览器,而不是节点上。

据我所知,npms可以用C ++编写,所以我想知道为什么没有节点的类似numpy的库。 对社会来说,还有没有足够的兴趣,需要这种权力? 有没有希望ES6function(列表parsing)将允许JavaScript编译器自动将本机JS代码vector化到C ++的速度? 我可能错过了别的?

编辑 ,以回应票选:注意,我不是要求“什么是最好的包xyz做”。 我只是想知道是否有技术上的原因,在节点上没有包裹,社会原因,没有理由,只有一个我错过了一个包。 也许是为了避免太多自以为是的批评,我想知道:我有大约10000个100×100的matrix。 什么是最好的(*更正,一个合理的快速)的方式来加在一起?

Edit2经过更多的挖掘,原来我正在search错误的东西。 谷歌的“node.js科学计算”,并有一些非常有趣的笔记链接:

  • https://cs.stackexchange.com/questions/1693/a-faster-leaner-javascript-for-scientific-computing-what-features-should-i-kee
  • http://www.quora.com/Can-Node-js-handle-numerical-computation-the-same-way-that-languages-like-R-or-Julia-can
  • Javascript和科学处理?

基本上就我所知,目前还没有人打扰。 而且,由于js TypedArrays中有一些重大的遗漏(比如64位整数),使用NPMs可能很难增加良好的支持,而且不会破坏引擎本身 – 这是会导致失败的。 再次,我没有进一步研究这最后的声明。

不,没有技术上的原因,为什么一个类似numpy的包不存在Node.js,更一般的JavaScript。

阻止Node.js和JavaScript在数据科学和数字计算社区中获得更多的思想共享有两个主要障碍。

第一个障碍是社区。 虽然JavaScript社区是巨大的,但在社区中做数字计算有趣的事情的人数很less。 因此,如果你想在JavaScript和Node.js中进行数值计算,寻找可以帮助你的资源可能会很困难,并且可能会感到孤独。

接下来,缺乏可比的图书馆(鸡和蛋:图书馆需要吸引图书馆作者和作者需要编写好的图书馆)。 没有技术上的原因,为什么图书馆不能写在JavaScript或利用Node.js(例如,通过本地附加组件)。 我知道,因为我用JavaScript编写了许多数字计算库。 所以虽然JavaScript中可以进行数值计算,但问题源于无法吸引具有足够专业知识的开发人员,并且无法花时间和精力编写高质量的数字计算实现。

关于OP中提到的具体语言特征:

  • ES6 / ES2015 :最近增加的语言都没有帮助或妨碍JavaScript中数字计算库的开发。 列表parsing等潜在的附加function也不是游戏转换器。 Web平台的一个变化就是WebAssembly。 使用WebAssembly,编译C / C ++ / Fortran库以在Web浏览器中运行将会变得更容易。 在回答这个问题的时候,WebAssembly看起来是将SIMD引入networking的手段,尽pipe重点似乎在SIMD上,而不是长时间。 但即使使用WebAssembly,将数字计算库移植到Web上也不会像按下编译button那么简单。 数字计算代码库将需要按摩以适合在networking上使用,即便如此,更高级别的API也可能需要被编写来掩盖一些较低级别的特征,例如手动pipe理堆。
  • 原生插件 :是的,节点模块可以写成本地插件,允许在Node.js应用程序中使用C / C ++ / Fortran代码。 个人为此写了图书馆; 例如,请参阅stdlib 。 如果做得好,Node.js可以以与直接使用本地实现相当的速度执行数值计算。
  • 键入数组 :就像现在一样,它们适用于数值计算。 与C类似,您可以创build池缓冲区,从而实现有效的内存重用和更好的性能。 此外,类似于R,Python和Julia等语言,可以利用types化数组创buildndarray(又名跨接数组)接口。 虽然U / Int64整数数组当前在这个答案的时候是不可用的,但是(a)它们的缺席并不是一个显示终止,而且(b)在规范级别上提议将U / Int64整数数组添加到JavaScript。 复数与结构types同上。

我个人的看法是,在JavaScript和Node.js中,某种forms的数值计算是不可避免的。 至less在基本层面上,优势(无处不在,分布,性能)和潜在的应用(边缘计算,整合机器学习,数据可视化)的强大力量不足以支持数据科学应用。

披露 :我和其他人正在研究一个项目( https://github.com/stdlib-js/stdlib ),目的是提供JavaScript和Node.js中的数字计算设施。

大部分的节点工作似乎都是在networking“全栈”的范围内,在快速数字处理是优势的领域,工作量要less得多。

在快速数字处理是一个优势的领域,Python,R等可能具有主导思想。

结合这两个事实,最终不会有很多人将精力投入节点数字处理库。

虽然我从来没有尝试过,但NumJs看起来非常酷! 这是一个非常令人信服的尝试在JavaScript NumPy克隆。

这就是我所用的,只是为了方便广播业务。

我没有试过这个,但是我发现了node-lapack 。 由于Numpy从使用blas / lapack来完成所有事情的速度,这应该会有所帮助。 从自述它看起来像它也有一个数组对象,这是在每个操作之间不转换JS和lapack之间必不可less的。

这是他们演示的一部分:

 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 

它似乎是一个非常直接的接口,使用相同的名字,所以在这方面,它不像Numpy那样方便,但至less它需要处理数组维度和东西,应该是一样快(因为大部分的工作是在这两种情况下都由Lapack完成)。

但是,这在浏览器中不起作用,这意味着无处不在的地方,Python可能也是可用的。 就个人而言,我会坚持使用Python,这是更为数字的东西,除非有一些特定的节点functionPython缺less…

我正在开发PyExtJS在看

https://github.com/fernandezajp/PyExtJS