在 Chaquopy 中转换数组和张量

Converting Arrays and Tensors in Chaquopy

我该怎么做?

我看到你的 post 说你可以将 java 对象传递给 Python 方法,但这不适用于 numpy 数组和 TensorFlow 张量。以下内容及其各种变体是我尝试过但无济于事的方法。

double[][] anchors = new double[][]{{0.57273, 0.677385}, {1.87446, 2.06253}, {3.33843, 5.47434}, {7.88282, 3.52778}, {9.77052, 9.16828}};
PyObject anchors_ = numpy.callAttr("array", anchors);

我也尝试过使用连接来创建它,但它不起作用。这是因为连接(和堆栈等)需要一个包含数组的 names 的序列作为参数传递,而似乎没有办法用 Chaquopy 做到这一点在 Java。

有什么建议吗?

我设法找到了两种实际可以将这个玩具数组转换为正确 Python 数组的方法。

  • 在Java中:
import com.chaquo.python.*;

Python py = Python.getInstance();
PyObject np = py.getModule("numpy");
PyObject anchors_final = np.callAttr("array", anchors[0]);
anchors_final = np.callAttr("expand_dims", anchors_final, 0);
for (int i=1; i < anchors.length; i++){
  PyObject temp_arr = np.callAttr("expand_dims", anchors[i], 0);
  anchors_final = np.callAttr("append", anchors_final, temp_arr, 0);
}
// Then you can pass it to your Python file to do whatever


  • 在Python(更简单的方法)

将数组传递给 Python 函数后,使用例如:

import com.chaquo.python.*;

Python py = Python.getInstance();
PyObject pp = py.getModule("file_name");
PyObject output = pp.callAttr("fnc_head", anchors);

在您的 Python 文件中,您可以简单地执行以下操作:

def fnc_head():
    anchors = [list(x) for x in anchors]
    ...
    return result

这些是用二维数组测试的。其他数组类型可能需要修改。

我假设您收到的错误是 "ValueError: only 2 non-keyword arguments accepted"。

在调用 numpy.array 时,您可能还收到来自 Android Studio 的警告,称 "Confusing argument 'anchors', unclear if a varargs or non-varargs call is desired"。这就是问题的根源。您打算传递一个 double[][] 个参数,但不幸的是 Java 将其解释为五个 double[] 个参数。

Android Studio 应该会自动修复将参数转换为 Object,即:

numpy.callAttr("array", (Object)anchors);

这告诉 Java 编译器您打算只传递一个参数,然后 numpy.array 将正常工作。