在 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
将正常工作。
我该怎么做?
我看到你的 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
将正常工作。