节点的类似numpy的包

Cla*_*ude 49 javascript c++ numpy multidimensional-array node.js

在我开发Python的过程中,如果你设法重写那些循环通过你的ndarray并做了一些事情的代码,我会一直惊讶于事情会变得多快多少,同时在整个数组上运行的numpy函数.最近我越来越多地转向节点,我正在寻找类似的东西.到目前为止,我发现了一些东西,其中没有一个看起来很有希望:

  • scikit-node,在python中运行scikit-learn,以及与node接口.我没有尝试过,但我不指望它能给我提供我想要的最快速度.
  • 有一些相当古老的,更新的javascript矩阵库(sylvester,gl-matrix,...).除了不确定它们是否适用于大于4x4的矩阵(这在3D渲染中最有用),它们似乎是原生的javascript(有些,不确定这些,使用webGL加速).很棒的浏览器,而不是节点.

据我所知,npms可以用C++编写,所以我想知道为什么节点没有类似numpy的库.对于那些需要这种力量的社区,是否对节点没有足够的兴趣?是否有希望ES6功能(列表推导)将允许javascript编译器自动将原生JS代码矢量化为C++速度?我可能错过了其他的东西吗?

编辑,以回应关闭投票:注意,我不是要求"什么是做xyz的最佳软件包".我只是想知道是否存在技术上的原因,在节点上没有包这么做,这是一个社会原因,或者完全没有理由,只有一个我错过的包.也许为了避免太多自以为是的批评,我想知道:我有大约10000个矩阵,每个100 x 100.将它们组合在一起的最佳方法是什么(*校正,合理快速)?

编辑2 经过一番挖掘,结果发现我正在谷歌搜索错误的东西.谷歌的"node.js科学计算"和一些非常有趣的笔记链接:

基本上据我所知,目前还没有人打扰过.此外,由于js TypedArrays中存在一些重大遗漏(例如64位整数),因此仅仅使用NPM可能很难增加良好的支持,而不是破坏引擎本身 - 这会破坏目的.然后,我没有进一步研究这最后的陈述.

kgr*_*yte 25

不,没有技术原因可以解释为什么Node.js不存在类似numpy的包,更常见的是JavaScript.

阻止Node.js和JavaScript在数据科学和数字计算社区中实现更多思维共享有两个主要障碍.

第一个障碍是社区.虽然JavaScript社区非常庞大,但该社区中人们在数字计算中做有趣事情的人很少.因此,如果你想在JavaScript和Node.js中进行数值计算,找到资源来帮助你一路走来可能很难,而且它可能感觉像是一种孤独的努力.

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

关于OP中提到的特定语言功能:

  • ES6/ES2015:最近的语言添加都没有帮助或阻碍JavaScript中数字计算库的开发.列表推导等潜在的附加功能也不会改变游戏规则.对Web平台的一个改变是WebAssembly.使用WebAssembly,可以更轻松地编译在Web浏览器中运行的C/C++/Fortran库.在回答这个问题的时候,WebAssembly看起来是将SIMD引入网络的手段,可能会允许一些加速,尽管重点似乎是短SIMD,而不是长时间.但即使使用WebAssembly,将数字计算库移植到Web也不会像点击编译按钮那么简单.需要按摩数字计算代码库以便在Web上使用,即使这样,也可能需要编写更高级别的API来掩盖一些较低级别的功能,例如手动管理堆.
  • 本机加载项:是的,节点模块可以编写为本机加载项,允许在Node.js应用程序中使用C/C++/Fortran代码.个人为此编写了图书馆; 例如,请参阅stdlib.如果做得好,Node.js可以以与直接使用本机实现相当的速度执行数值计算.
  • 类型化数组:就像现在一样,它们适用于数值计算.与C类似,您可以创建池化缓冲区,从而实现高效的内存重用和更好的性能.此外,类似于R,Python和Julia等语言,您可以利用类型化数组来创建ndarray(又名跨步数组)接口.虽然此答案时U/Int64整数数组当前不可用,但(a)它们的缺席不是显示停止,(b)提议在规范级别上推进以向JavaScript添加U/Int64整数数组.对于具有结构化类型的复数而言也是如此.

我个人认为,JavaScript和Node.js中某种形式的数值计算是不可避免的.优势(普遍性,分布,性能)和潜在应用(边缘计算,集成机器学习,数据可视化)过于强大,无法支持数据科学应用,至少在基础层面.

披露:我和其他人正在开发一个项目(https://github.com/stdlib-js/stdlib),旨在提供JavaScript和Node.js中的数字计算工具.


Jul*_*.M. 12

这是Google的TensorFlow.js(以前称为https://deeplearnjs.org),它正是这样做的,并且内置了使用WebGL在GPU上训练深度神经网络的能力.您也可以将TensorFlow模型移植到它.

不要误以为这只是为了深度学习.它是一个完全成熟的数字计算平台,内置GPU加速功能.它遵循热切的"按你执行"模式,如NumPy(和Tensorflow Eager,和PyTorch等),而不是像Tensorflow那样的"定义然后运行"模型.因此,对于之前使用过NumPy的人来说,使用它会很自然.

这是非常有用的Github回购:

https://github.com/tensorflow/tfjs-core (旧链接https://github.com/PAIR-code/deeplearnjs现在重定向到那里)

  • 好答案!deeplearn.js现在称为tensorflow.js,可以在https://js.tensorflow.org找到 (4认同)
  • 这似乎是唯一(当前)合理的答案。对库的所有其他建议似乎要么是实验性的,要么是用纯 JavaScript 编写的。NumPy 的主要好处是它的核心是用 C 编写的,仅仅实现 NumPy 的 API 没有意义,你也想要性能提升。但我暂时猜测,与 TensorFlow 是围绕 C++ 库的 Python 或 JavaScript 包装器一样,应该可以用 JavaScript API 包装 NumPy 的 C 代码。 (3认同)

Mar*_*ark 7

我没有试过这个,但我找到了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
Run Code Online (Sandbox Code Playgroud)

它似乎是一个非常直接的界面使用相同的名称lapack,所以在这方面,它不像Numpy那样方便,但至少它需要处理数组维度和东西,并且应该快得多(因为大部分工作是在任何一种情况下由拉帕克完成).

但是,这在浏览器中不起作用,这意味着在任何可用的地方都可以使用Python.就个人而言,我坚持使用Python,这对于数字化的东西更为重要,除非有一些特定的Node功能缺少Python ......


Ali*_*aed 7

numjs是 Nodejs 中类似 numpy 的库。