【问题标题】:How to read numpy array in ND4j如何在 ND4j 中读取 numpy 数组
【发布时间】:2019-10-10 21:23:52
【问题描述】:

我也有处理 n 维数组的组件。一个组件是用python编写的,它处理数据并将处理后的ndarray保存为tobytes()。现在另一个组件是用java编写的,需要读取第一个组件产生的序列化ndarray。

我很好奇是否有任何现有的 java 库可以读取序列化的 numpy 数组。或者有更好的方式在 java 和 python 之间通信 ndarray。

感谢任何建议!

谢谢!

【问题讨论】:

    标签: pandas numpy deeplearning4j nd4j


    【解决方案1】:

    ND4J 支持读取和写入 Numpy 数组。查看 xxxNpyYYYArray methods 的 ND4J javadocs。

    它可以读取和写入文件、字节数组甚至是指向 numpy 数组的原始指针。

    指针方法允许在不复制或序列化的情况下使用数组。我们在jumpy(通过pyjnius 运行Java)和使用javacpp's cpython/numpy preset 在Java 进程中运行cpython 解释器时使用指针方法。

    【讨论】:

    • @vm_eddie 感谢您指出这一点。所以在 python 方面,我用 np.tobytes() 保存 numpy 数组并用 base64 编码。然后在java端,我用base64解码并用Nd4j.createNpyFromByteArray()加载它。但是,我收到Assertion failed: (littleEndian), function parseNpyHeaderStr, file /Volumes/jenkins_ws/jenkins/workspace/deeplearning4j-deeplearning4j-1.0.0-beta4-macosx-x86_64-cpu/libnd4j/include/cnpy/cnpy.cpp, line 216. 你知道这意味着什么吗?
    【解决方案2】:

    我已经使用 Apache Arrow 解决了这个问题。

    首先,pyarrow 包有一个 numpy ndarray API 来将数组序列化为字节。基本上,ndarray 变成了一个箭头字节序列批次。

    然后 java API 提供了一个VectorSchemaRoot 来从字节中读取它。你可以得到箭头数组中的值。您可以使用此数组创建 ND4J 数组(如果需要),或直接操作您的数组。

    详细操作可以参考 Apache Arrow 文档,如果有什么障碍我们可以在这里讨论。

    此外,Arrow 使用本机内存来存储缓冲区,因此数据不在 Java 堆中。这在某些时候可能会成为问题。

    任何其他解决方案也可以与我分享。 :)

    【讨论】:

      猜你喜欢
      • 2016-06-05
      • 2021-06-03
      • 2017-06-15
      • 1970-01-01
      • 2018-07-21
      • 2016-08-26
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      相关资源
      最近更新 更多