javascript-点头的类似numpy的软件包

在我从事Python开发的那几年中,我总是惊讶于如果您设法重写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经过更多的挖掘,结果发现我在搜索错误的东西。 Google用于“ node.js科学计算”,并提供了一些非常有趣的注释的链接:

  • [HTTPS://此时.stack Exchange.com/questions/1693/啊-faster-leaner-JavaScript-佛如-scientific-computing-what-features-手榴弹-i-可哦]
  • [HTTP://呜呜呜.Quora.com/can-node-就是-handle-numerical-computation-他和-same-蛙泳-that-languages-立刻-R-or-Julia-惨]
  • Javascript和科学处理?

基本上据我所了解,到目前为止,没有人打扰过。 另外,由于js TypedArrays中有一些主要遗漏(例如64位整数),仅通过使用NPM而不是侵入引擎本身可能很难添加良好的支持,这会破坏目的。 再说一次,我没有进一步研究最后的陈述。

6个解决方案
24 votes

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

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

第一个障碍是社区。 尽管JavaScript社区很大,但该社区中从事数字计算有趣的工作的人却很小。 因此,如果您想使用JavaScript和Node.js进行数值计算,那么一路寻找资源来帮助您可能会很困难,并且这似乎是一种孤独的尝试。

其次,缺少类似的库(鸡和鸡蛋:需要库来吸引库作者,而作者则需要编写好的库)。 没有技术原因无法使用JavaScript编写库或无法使用Node.js(例如,通过本机加载项)。 我知道,因为我已经用JavaScript编写了许多数值计算库。 因此,尽管在JavaScript中可以进行数值计算,但问题出在无法吸引具有足够专业知识并能够投入时间和精力来编写高质量数值计算实现的开发人员。

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

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

我个人认为,JavaScript和Node.js中不可避免的某种形式的数字计算。 优势(普适性,分布,性能)和潜在应用程序(边缘计算,集成机器学习,数据可视化)的发展力量太强,至少在基本级别上无法支持数据科学应用程序。

披露:我和其他人目前正在研究一个项目([https://github.com/stdlib-js/stdlib)],该项目旨在提供JavaScript和Node.js中的数值计算功能。

kgryte answered 2020-06-25T22:12:01Z
12 votes

这是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]现在重定向到那里)

Jules G.M. answered 2020-06-25T22:12:35Z
7 votes

我没有尝试过,但是我发现了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在数字方面占主导地位……

Mark answered 2020-06-25T22:13:09Z
4 votes

大部分节点工作似乎都在Web“全栈”领域中,而在快速数值处理是一个优势的领域中进行的工作却少得多。

在快速数值处理是优势的领域,Python,R等可能占据主导地位。

结合这两个事实,您最终会花费很多精力来处理节点数字处理库。

Mark Harrison answered 2020-06-25T22:13:38Z
3 votes

我正在开发PyExtJS,请参阅

[HTTPS://GitHub.com/费尔南德砸键盘/py ExtJS]

Alvaro Fernandez answered 2020-06-25T22:14:03Z
1 votes

与@Julius关于deeplearn.js的回答相同,tensorflow.js是同一项目的延续。 为了在REPL中使用tensorflow模块,我使用了以下方法在全球范围内安装它(FYI-通常建议不要这样做):

$ npm install --global @tensorflow/tfjs

然后,我运行[9,16]启动节点REPL。

这可能对您有所不同(特别是如果您决定在本地安装tensorflow),但是我输入了此内容以引用tensorflow模块:

var tf = require('/usr/local/lib/node_modules/@tensorflow/tfjs')

要创建1级张量(相当于numpy中的一维数组),请尝试:

var x = tf.tensor( [-3,4] )

并将其与:

x.square().print()

您应该得到[9,16]作为输出。 有关更多详细信息,请参见[https://js.tensorflow.org]。

我会说tensorflow.js不仅是numpy的JS替代品,而且是sklearn,keras以及当然tensorflow的JS替代品。

scottlittle answered 2020-06-25T22:14:49Z
translate from https://stackoverflow.com:/questions/31412537/numpy-like-package-for-node