我也有处理 n 维数组的组件。一个组件是用 python 编写的,它处理数据并将处理后的 ndarray 保存为tobytes()
. 现在另一个组件是用java编写的,需要读取第一个组件产生的序列化ndarray。
我很好奇是否有任何现有的 java 库可以读取序列化的 numpy 数组。或者有更好的方式在 java 和 python 之间通信 ndarray。
任何建议表示赞赏!
谢谢!
我也有处理 n 维数组的组件。一个组件是用 python 编写的,它处理数据并将处理后的 ndarray 保存为tobytes()
. 现在另一个组件是用java编写的,需要读取第一个组件产生的序列化ndarray。
我很好奇是否有任何现有的 java 库可以读取序列化的 numpy 数组。或者有更好的方式在 java 和 python 之间通信 ndarray。
任何建议表示赞赏!
谢谢!
ND4J 支持读取和写入 Numpy 数组。查看 ND4J javadocs 中的xxxNpyYYYArray 方法。
它可以读取和写入文件、字节数组甚至是指向 numpy 数组的原始指针。
指针方法允许在不复制或序列化的情况下使用数组。我们使用 jumpy 内部的指针方法(通过pyjnius运行 Java)以及使用javacpp 的 cpython/numpy 预设在 Java 进程中运行 cpython 解释器时。
我已经使用 Apache Arrow 来解决这个问题。
首先,pyarrow
包有一个 numpy ndarray API 来将数组序列化为字节。基本上,ndarray 变成了一个箭头字节序列批次。
然后 java API 提供了一个VectorSchemaRoot
从字节中读取它的方法。你可以得到箭头数组中的值。您可以使用此数组创建 ND4J 数组(如果需要),或直接操作您的数组。
详细操作可以参考 Apache Arrow 文档,如果有什么障碍我们可以在这里讨论。
此外,Arrow 使用本机内存来存储缓冲区,因此数据不在 Java 堆中。这在某些时候可能是一个问题。
任何其他解决方案也可以与我分享。:)