Java中类似于Numpy多维对象的等效物

28

使用Numpy多维数组一段时间后,我真的很喜欢它。使用它能够编写简洁易读且相对通用的算法。我希望在Java中也能有类似的东西。在自己编写具备Numpy API的多维数组之前,是否已经有这样的工具存在?

[PS] 我查了一下,没有找到。


1
如果您正在参考Java 平台Scalala看起来是一个不错的选择... - Samuel Audet
1
你不需要使用Scala。你所提到的多维数据结构是矩阵。你需要一个线性代数库,比如LA4J。 - duffymo
10个回答

20

这篇文章是2011年的。截至2015年底,我想提到有一个新的Java库声称自己是numpy的替代品->nd4j。好处在于,nd4j是基于不同库(如blas)的抽象层。根据矩阵大小,有两倍于numpy或jblas更快速的底层实现。而且你的代码是真正的跨平台。


8
很遗憾,即使是4年后,ND4j的文档仍然相当不完善。 - user118967
1
即使是像广播这样基本的操作,也没有明确的文档说明。例如,请参见 https://stackoverflow.com/q/60143939 和 https://stackoverflow.com/q/42309075。 - user118967
4
你好,你能在 https://github.com/eclipse/deeplearning4j/issues 提交一个问题吗?这将会是一个更加高效的讨论方式。我们很乐意解决个人需求,同时也知道我们可以不断改进(就像任何开源项目一样)。 - Adam Gibson
1
今天起,nd4j链接已经失效。 - theprogrammer
2
@theprogrammer https://deeplearning4j.konduit.ai/nd4j/basics - rocksNwaves

13

这个库叫做Vectorz (https://github.com/mikera/vectorz),提供了一个完整的NDArray,其功能基本等同于Numpy的NDArray,即提供以下功能:

  • 任意N维数值数组(在此情况下是Java doubles)
  • 使用跨步存取(strided access)的轻量级视图,以进行高效的切片操作
  • 广泛的数学操作,并具有高效的实现

它也非常快:对于大多数操作,它比NumPy要快得多,尽管对于某些大矩阵操作,NumPy可能仍然更快,因为它使用本地BLAS库加速这些操作。

以下是NDArray类本身:

https://github.com/mikera/vectorz/blob/develop/src/main/java/mikera/arrayz/NDArray.java

免责声明:我是Vectorz的作者


嗨,Mike。我发现Vectorz对我非常有吸引力。我正在实时进行从RGB到HSL的颜色格式转换,并认为Vectorz正是我所需要的。是否可以以高效的方式将某些数学表达式应用于矩阵中的每个元素?假设矩阵是单个相机帧的表示,比如说2D数组。 - Yuriy Chernyshov
@Yuriy 有一个 applyOp 函数可以让你对整个数组应用任意(包括自定义)操作。值得研究。 - mikera
为什么Vectorz被故意设计成不使用本地和/或GPU代码? - Aleksandr Dubinsky
@AleksandrDubinsky 没有什么可以阻止Vectorz使用GPU。实际上,我在这里有一个实验性的OpenCL实现:https://github.com/mikera/vectorz-opencl - mikera
1
@RavikantTiwari,您可以使用a.join(b,1)来沿列连接(其中1是列维度,0为行)。 - mikera
显示剩余3条评论

4

您可以使用数值库进行线性代数计算,这些库中将包含矩阵。请查看Apache Commons Math


3
我知道那个库。它的API是一个经典的“向量和矩阵”API。我正在寻找一个类似于Numpy的API,它提供多维数组,将向量和矩阵统一为一个实体。基于个人经验,这种方法可以使许多数学代码更容易编写。 - Monkey
Vectorz(见我的答案)提供了任意多维数组,具有单一接口抽象(INDArray),由向量和矩阵实现。 - mikera

2
Scala有更多类似numpy的库,如果算的话。 (你甚至可以从Java中使用它们。) BIDMat承诺既强大又快速(并且由GPU提供支持)。
正如已经提到的那样,还有Breeze

2

2
只是注意到TF Java NdArray库由TensorFlow组织维护,但可以添加到任何Java项目中,并且不依赖于TensorFlow本身(在TensorFlow Java中,由TensorFlow支持的NdArray的等效物是Tensor)。 - Karl Lessard

2

所以最接近的匹配似乎是Colt!http://acs.lbl.gov/software/colt/

它具有多维数组对象、数组视图和通常的线性代数!而且它似乎相当高效。


3
请问,Colt 中哪个类代表多维数组? - Dims
@Dims 多维数组的接口是AbstractMatrix,网址为http://dst.lbl.gov/ACSSoftware/colt/api/cern/colt/matrix/impl/AbstractMatrix.html。Colt提供的实现仅涵盖1、2和3维情况。 - dlegland
3
@dlegland所说的与numpy远非等效。 - Dims

1

1

我建议使用la4j,这是一个优雅、现代的线性代数库,或者JBLAS,它将BLAS移植到Java。


1

-4

我认为Java没有像NumPy一样的东西。NumPy是一个大型的数学导向项目,不太适合Java的思维方式。

这并不意味着Java中没有好的集合库!Guava有Table接口,其中包括两个很好的实现,ArrayTableHashBasedTable。它更像是一个集合库而不是数学工具,但非常有用。

对于速度和内存效率,可以使用Trove。这是一个与基本类型一起使用的集合库。

对于矩阵操作,JAMA似乎不错。

据我所知,在Java中,您需要编写更多的代码并使用更多的库,而不是Python。


4
为什么一个数学导向的项目不适合Java编程思维? - user118967

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接