节点的类似numpy的程序包[已关闭]

ws51t4hk  于 2023-02-08  发布在  其他
关注(0)|答案(8)|浏览(160)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

1年前关闭。
Improve this question
在我从事Python开发的这些年里,我一直很惊讶,如果你设法重写代码,让它循环遍历ndarray并做一些事情,用一次处理整个数组的numpy函数,事情会变得快得多。最近,我越来越多地切换到node,我也在寻找类似的东西。到目前为止,我已经找到了一些东西,但看起来都没有希望:

  • scikit-node,在python中运行scikit-learn,并与node接口,我还没有尝试过,但我不期望它能给我带来我想要的最快速度。
  • 有一些相当老的和更新的javascript矩阵库(sylvestergl-matrix,...)除了不能确定它们能很好地处理大于4x 4的矩阵(这在3D渲染中最有用)外,它们似乎是原生javascript(有些,不确定这些,使用webGL加速)。在浏览器上很好,在节点上不太好。

据我所知,npms可以用C编写,所以我想知道为什么没有numpy类的node库。是不是需要这种能力的社区对node还没有足够的兴趣?ES6特性(列表解析)是否有希望允许javascript编译器自动将本机JS代码矢量化到C的速度?我是否错过了其他东西?

编辑,响应接近投票:注意,我不是在问“什么是做xyz的最好的软件包”,我只是想知道是否有技术上的原因,没有软件包在node上做这个,或者是社会原因,或者根本没有原因,只是有一个软件包我错过了。也许为了避免太多固执己见的批评,我想知道:我有大约10000个矩阵,每个矩阵都是100 × 100。把它们加在一起的最好方法是什么(* 校正,一个合理的快速)?
Edit 2经过进一步的挖掘,我发现我在谷歌上搜索的东西是错误的。谷歌“node.js科学计算”,并有一些非常有趣的笔记链接:

基本上就我现在的理解,到目前为止还没有人为此烦恼。而且,由于js TypedArrays中有一些重大的遗漏(比如64位int),仅仅使用NPM而不修改引擎本身可能很难添加良好的支持---这将违背目的。再说一次,我没有进一步研究最后一句话。

w9apscun

w9apscun1#

不,Node.js和更一般的JavaScript没有类似numpy的包,这并没有技术上的原因。
有两个主要障碍阻止Node.js和JavaScript在数据科学和数值计算社区中获得更多的关注。
第一个障碍是社区。虽然JavaScript社区很大,但在社区中从事有趣的数值计算工作的人却很少。因此,如果你想用JavaScript和Node.js进行数值计算,寻找资源来帮助你可能会很困难,而且这可能会让你感觉像是一个孤独的奋进。
其次,缺乏可比文库(鸡和蛋:需要库来吸引库的作者,并且需要作者来编写好的库)。没有技术上的原因为什么库不能用JavaScript编写或利用Node.js(例如,通过本地附加组件)。我知道,因为我用JavaScript编写了许多数值计算库。因此,尽管数值计算在JavaScript中是可能的,该问题源于不能吸引具有足够专业知识并且能够投入编写高质量数值计算实现所需的时间和精力的开发者。
关于业务方案中提到的具体语言特点:

*ES6/ES2015:最近的语言添加没有帮助或阻碍数值计算库在JavaScript中的发展。2潜在的添加,如列表解析也不会改变游戏规则。3对web平台的一个改变是WebAssembly。4有了WebAssembly,编译C/C++/Fortran库以在web浏览器中运行将变得更容易。5在回答这个问题时,WebAssembly看起来是将SIMD引入Web的方法,可能允许一些加速,尽管重点似乎是短SIMD,而不是长SIMD。将数值计算库移植到网络上并不像点击编译按钮那么简单。数值计算代码库需要被修改以适合在web上使用,并且,即使这样,也可能需要编写更高级的API来屏蔽一些较低级的特性,例如手动管理堆。
*本机附加组件:是的,节点模块可以写成本地插件,允许在Node.js应用程序中使用C/C++/Fortran代码。例如,参见stdlib。如果做得好,Node.js可以以与直接使用本地实现相当的速度执行数值计算。
*类型化数组:现在,它们适合于数值计算。2与C类似,你可以创建池化缓冲区,这允许有效的内存重用和更好的性能。3此外,与R、Python和Julia类似,你可以利用类型化数组来创建ndarray(aka strided array)接口。虽然U/Int 64整数数组目前在回答这个问题时还不可用,(a)它们的缺失并不是一个障碍,(b)在规范层面上提出了在JavaScript中添加U/Int 64整数数组的建议,结构化类型的复数也是如此。

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

披露:我和其他人目前正在致力于一个项目(https://github.com/stdlib-js/stdlib),该项目旨在提供JavaScript和Node.js中的数值计算工具。

knsnq2tg

knsnq2tg2#

这是谷歌的TensorFlow.js(以前的https://deeplearnjs.org),它正是这样做的,它内置了使用WebGL在GPU上训练深度神经网络的能力。
不要误以为这只适用于深度学习。这是一款成熟的数值计算平台,内置GPU加速功能。它遵循NumPy(以及Tensorflow Eager、PyTorch等)等“边执行边执行”的模式,而不是Tensorflow等“先定义后运行”的模式。因此,任何使用过NumPy的人都会觉得使用它很自然。
下面是Github的回购信息:
https://github.com/tensorflow/tfjs-core(旧链接https://github.com/PAIR-code/deeplearnjs现在重定向到那里)

zf2sa74q

zf2sa74q3#

我没有尝试过这个,但是我找到了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,它在数值方面更占主导地位,除非Python缺少一些特定的Node功能。

tuwxkamq

tuwxkamq4#

numjs是nodejs中一个类似numpy的库。

z9smfwbn

z9smfwbn5#

与@Julius对deeplearn.js的回答相同,tensorflow.js是同一个项目的延续。为了在REPL中使用tensorflow模块,我使用以下命令全局安装了它(仅供参考-通常建议不要这样做):

$ npm install --global @tensorflow/tfjs

然后,我运行$ node来启动节点REPL。
这对您来说可能有所不同(特别是如果您决定在本地安装tensorflow),但我输入以下内容是为了引用tensorflow模块:

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

要创建秩为1的Tensor(相当于numpy中的1-D数组),请尝试:

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

然后将其平方为:

x.square().print()

您的输出应该是[9,16]。有关详细信息,请参见https://js.tensorflow.org
我想说tensorflow.js不仅是numpy的JS替代品,还可以替代sklearn、keras,当然还有tensorflow。

7xzttuei

7xzttuei6#

大多数节点工作似乎都是在web“全栈”领域,在快速数值处理是优势的领域,所做的工作要少得多。
在快速数值处理是优势的领域,Python、R等可能占据主导地位。
合并这两个事实,您最终会发现没有多少人在节点数值处理库方面投入精力。

0pizxfdo

0pizxfdo7#

scijs的ndarray也很好。https://github.com/scijs/ndarray

var mat = ndarray(new Float64Array([1, 0, 0, 1]), [2,2])
 
//Now: 
// 
// mat = 1 0 
//       0 1 
//
aij0ehis

aij0ehis8#

我开始使用https://www.npmjs.com/package/@nexys/math-ts,它是一个非常简单和轻便的数字打印脚本库/包
给定值:https://github.com/Nexysweb/math-ts

相关问题