gpt4 book ai didi

java - Java 数组到 NumPy 数组的快速转换 (Py4J)

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:06:30 47 4
gpt4 key购买 nike

有一些很好的示例如何将 NumPy 数组转换为 Java 数组,但反之亦然 - 如何将数据从 Java 对象转换回 NumPy 数组。我有一个这样的 Python 脚本:

    from py4j.java_gateway import JavaGateway
gateway = JavaGateway() # connect to the JVM
my_java = gateway.jvm.JavaClass(); # my Java object
....
int_array=my_java.doSomething(int_array); # do something

my_numpy=np.zeros((size_y,size_x));
for jj in range(size_y):
for ii in range(size_x):
my_numpy[jj,ii]=int_array[jj][ii];

my_numpy 是 Numpy 数组,int_array 是 Java 整数数组 - int[ ][ ] 类型的数组。在 Python 脚本中初始化为:

    int_class=gateway.jvm.int       # make int class
double_class=gateway.jvm.double # make double class

int_array = gateway.new_array(int_class,size_y,size_x)
double_array = gateway.new_array(double_class,size_y,size_x)

虽然它按原样工作,但它不是最快的方法并且工作相当慢 - 对于 ~1000x1000 数组,转换花费了 5 分钟以上。

有什么办法可以在合理的时间内做到这一点吗?

如果我尝试:

    test=np.array(int_array)

我得到:

    ValueError: invalid __array_struct__

最佳答案

我遇到了类似的问题,并找到了一个比我测试的案例快 220 倍的解决方案:为了将一个 1628x120 的短整数数组从 Java 传输到 Numpy,运行时间从 11 秒减少到 0.05 秒。感谢this related StackOverflow question , 我开始调查 py4j byte arrays ,结果证明 py4j 有效地将 Java 字节数组转换为 Python 字节对象,反之亦然(按值传递,而不是按引用传递)。这是一种相当迂回的做事方式,但并不太难。

因此,如果你想传输一个维度为 iMaxxjMax 的整数数组 intArray(为了这个例子,我假设这些都作为实例变量存储在您的对象中),您可以先编写一个 Java 函数将其转换为 byte[],如下所示:

public byte[] getByteArray() {
// Set up a ByteBuffer called intBuffer
ByteBuffer intBuffer = ByteBuffer.allocate(4*iMax*jMax); // 4 bytes in an int
intBuffer.order(ByteOrder.LITTLE_ENDIAN); // Java's default is big-endian

// Copy ints from intArray into intBuffer as bytes
for (int i = 0; i < iMax; i++) {
for (int j = 0; j < jMax; j++){
intBuffer.putInt(intArray[i][j]);
}
}

// Convert the ByteBuffer to a byte array and return it
byte[] byteArray = intBuffer.array();
return byteArray;
}

然后,您可以编写 Python 3 代码来接收字节数组并将其转换为正确形状的 numpy 数组:

byteArray = gateway.entry_point.getByteArray()
intArray = np.frombuffer(byteArray, dtype=np.int32)
intArray = intArray.reshape((iMax, jMax))

关于java - Java 数组到 NumPy 数组的快速转换 (Py4J),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39095994/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com