我也有处理 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 堆中。这在某些时候可能是一个问题。
任何其他解决方案也可以与我分享。:)