节点的类似numpy的包

时间:2015-07-14 16:40:06

标签: javascript c++ node.js numpy multidimensional-array

在我开发Python的过程中,如果你设法重写那些通过你的ndarray循环并执行某些操作的代码,我总是惊讶于事情会变得多快多少,整个函数都可以工作的numpy函数阵列一下子。最近我越来越多地转向节点,我正在寻找类似的东西。到目前为止,我已经提出了一些看法很有希望的事情:

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

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

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

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

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

9 个答案:

答案 0 :(得分:21)

不,没有技术原因可以解释为什么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中的数字计算工具。

答案 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,请参阅

https://github.com/fernandezajp/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 
//