2

我该怎么做呢?

我看到您的帖子说您可以将 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);

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

有什么建议吗?

4

2 回答 2

4

我假设您收到的错误是“ValueError:仅接受 2 个非关键字参数”。

您可能还会在调用 时收到来自 Android Studio 的警告numpy.array,说“混淆参数 'anchors',不清楚是否需要 varargs 或非 varargs 调用”。这就是问题的根源。您打算传递一个double[][]参数,但不幸的是 Java 已将其解释为五个double[]参数。

Android Studio 应该为您提供将参数转换为 的自动修复Object,即:

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

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

于 2019-06-18T17:35:33.987 回答
0

我设法找到了两种将这个玩具数组转换为适当的 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

这些用二维阵列进行了测试。其他数组类型可能需要修改。

于 2019-06-18T16:32:09.123 回答