在Chaquopy中转换数组和张量

时间:2019-06-18 14:07:26

标签: python numpy tensorflow chaquopy

我该怎么做?

我看到您的帖子说,您可以将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 的序列作为参数传递,而Java中似乎没有办法用Chaquopy做到这一点。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分: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

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