Преобразование массивов и тензоров в Chaquopy - PullRequest
1 голос
/ 18 июня 2019

Как мне это сделать?

Я видел, как в вашем посте говорилось, что вы можете просто передавать 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);

Я также пытался использовать concatenate для создания этого, но это не работает.Это связано с тем, что для сцепления (и стека и т. Д.) Требуется, чтобы последовательность, содержащая names массивов, передавалась в качестве аргумента, и, похоже, нет способа сделать это с Chaquopy в Java.

Любой совет?

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Я предполагаю, что полученная вами ошибка была "ValueError: приняты только 2 аргумента без ключевых слов".

Вы, вероятно, также получили предупреждение от Android Studio при вызове numpy.array, говорящее "Запутывающий аргумент"якоря, неясно, желателен ли вызов varargs или non-varargs ".Это источник проблемы.Вы намеревались передать один double[][] аргумент, но, к сожалению, Java интерпретировала его как пять double[] аргументов.

Android Studio должна предложить вам автоматическое исправление приведения параметра к Object, то есть:

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

Это говорит компилятору Java, что вы намереваетесь передать только один аргумент, и тогда numpy.array будет работать правильно.

0 голосов
/ 18 июня 2019

Мне удалось найти два способа, которые фактически работают при преобразовании этого игрушечного массива в надлежащие массивы 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

Они были протестированы с 2-мя массивами. Другие типы массивов, вероятно, потребуют изменений.

...