【问题标题】:Java equivalent for the Numpy multi-dimensional objectNumpy 多维对象的 Java 等效项
【发布时间】:2012-01-12 14:49:14
【问题描述】:

使用了一段时间后,我非常喜欢 Numpy 多维数组。用简洁易读且相当通用的代码编写算法是有帮助的。我希望在 Java 中也有同样的东西。在自己使用类似 Numpy 的 API 编写多维数组之前,是否已经有这样的事情了?

[PS]我搜了一下,没看到

【问题讨论】:

  • 如果您指的是 Java 平台Scalala 看起来是个不错的候选...
  • 你不需要 Scala。您所指的那些多维数据结构是矩阵。你需要一个线性代数库,比如 LA4J。

标签: java multidimensional-array numpy


【解决方案1】:

OP 是从 2011 年开始的。所以截至 2015 年底,我想提一下,城里有一个新孩子,他声称自己是 numpy for java -> nd4j。好消息是 nd4j 是 blas 等不同库之上的抽象层。根据矩阵的大小,底层实现是 fast 的两倍,是 numpy 或 jblas 的两倍。而且您的代码是真正独立于平台的。

【讨论】:

【解决方案2】:

Vectorz (https://github.com/mikera/vectorz) 提供了一个功能齐全的 NDArray,它在功能上与 Numpy 的 NDArray 大致相当,即它提供了完整的功能:

  • 数值的任意 N 维数组(在这种情况下,Java 双精度)
  • 使用跨步访问实现高效切片的轻量级视图
  • 广泛的数学运算和高效的实现

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

这是 NDArray 类本身:

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

免责声明:我是 Vectorz 的作者

【讨论】:

  • Numpy 可以使用本机 BLAS 支持进行编译,例如OpenBlas 或 ATLAS。 Vectorz 利用了一些优化的线性代数库?
  • Vectorz 不支持本机库 - 它被故意设计为纯 JVM 代码。还有其他可以使用 BLAS 的 Java 库(例如 MTJ、JBlas)。
  • 嗨,迈克。我发现 Vectorz 对我很有吸引力。我正在实时进行从 RGB 到 HSL 的颜色格式转换,并认为 Vectorz 正是我所需要的。是否有可能以有效的方式将一些数学表达式应用于矩阵中的每个元素?假设矩阵是单个相机帧的表示,假设是二维数组。
  • @Yuriy 有一个applyOp 函数可以让您对整个数组应用任意(包括自定义)操作。值得研究。
  • @RavikantTiwari 您可以使用 a.join(b,1) 沿列连接(1 为列维度,0 为行)
【解决方案3】:

您可以将数值库用于线性代数;那些将有他们的矩阵。看看Apache Commons Math

【讨论】:

  • 我知道那个库。 API 是一个经典的“向量和矩阵”。我正在寻找一个像 Numpy 一样的,它提供多维数组,将向量和矩阵统一为一个实体。这种基于个人经验的方法最终使许多数学代码更容易编写。
  • Vectorz(见我的回答)提供了具有单一接口抽象(INDArray)的任意多维数组,由向量和矩阵实现
【解决方案4】:

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

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

【讨论】:

【解决方案5】:

Scala 有更多类似 numpy 的库,如果这很重要的话。 (您甚至应该能够从 Java 中使用它们。)

BIDMat 承诺功能强大且速度快(并且支持 GPU)。

如前所述,还有Breeze

【讨论】:

    【解决方案6】:

    另一个不错的选择是使用 Spark 的 DataFrame API。

    http://spark.apache.org/docs/latest/sql-programming-guide.html

    这为您提供了一个类似于 Pandas/Numpy 的 Java 数组接口。此外,代码本质上是可并行化的,如果您的数据量增加,可以在机器集群上运行。

    【讨论】:

      【解决方案7】:

      Java 对于 nd-arrays 相当笨拙(没有运算符重载等)。如果 Kotlin 没问题,可以试试 Kotlin-NumPy (https://github.com/Kotlin/kotlin-numpy)

      nd4j (https://github.com/deeplearning4j/nd4j) 前段时间还蛮流行的,现在好像没维护了。

      【讨论】:

        【解决方案8】:

        这是一个老问题,但我只是想添加这两个 Java ndarray 库:

        【讨论】:

        • 请注意,TF Java NdArray 库由 TensorFlow 组织维护,但可以添加到任何 Java 项目中,并且不依赖于 TensorFlow 本身(相当于由 TensorFlow 支持的 NdArrayTensor 在 TensorFlow Java 中)
        【解决方案9】:

        我推荐la4j,一个优雅的现代线性代数库,或者JBLAS,另一个将 BLAS 移植到 Java 的库。

        【讨论】:

          【解决方案10】:

          我会说 java 没有什么“喜欢” numpy。 numpy 是一个大型的面向数学的项目,它并不真正符合 java 的心态。

          并不是说java中没有好的集合库! Guava 有Table 接口和两个很好的实现,ArrayTableHashBasedTable。它更像是一个集合库而不是一个数学工具,但它非常有用。

          为了速度和内存效率,这里是trove。一个使用原语的集合库。

          对于maticies 操作,JAMA 似乎不错。

          据我所知,您需要在 java 中编写更多代码并使用比 python 更多的库。

          【讨论】:

          • 哼...为什么不适合 Java 思维方式的数学导向项目?
          猜你喜欢
          • 2017-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-03
          • 2012-12-15
          • 1970-01-01
          • 2014-09-05
          相关资源
          最近更新 更多