我正在尝试从python访问一些java类(不是我编写的)。我已成功使用JCC编译它们,并且可以毫无问题地访问这些方法。我可以调用一个方法,需要一个numpy 1D数组(或一个列表,它们是相同的),但我无法弄清楚如何创建一个2D或3D,JArray来提供代码。
似乎由于numpy数组是嵌入式列表,因此它们无法直接转换为JArrays。 JCC doc试图解释如何做到这一点,但它完全模糊不清。
http://lucene.apache.org/pylucene/jcc/readme.html
将obj强制转换为Document
数组JArray('object').cast_(obj, Document)
在这两种情况下,obj的java类型必须与它被>强制转换为的数组类型兼容。
使用嵌套数组:
d = JArray('object')(1, Document) d[0] = Document() d JArray<object>[<Document: Document<>>] d[0] <Document: Document<>> a = JArray('object')(2) a[0] = d a[1] = JArray('int')([0, 1, 2]) a JArray<object>[<Object: [Lorg.apache.lucene.document.Document;@694f12>, <Object: [I@234265>] a[0] <Object: [Lorg.apache.lucene.document.Document;@694f12> a[1] <Object: [I@234265> JArray('object').cast_(a[0])[0] <Object: Document<>> JArray('object').cast_(a[0], Document)[0] <Document: Document<>> JArray('int').cast_(a[1]) JArray<int>[0, 1, 2] JArray('int').cast_(a[1])[0] 0
这是一些代码,但由于这需要一个已编译的java类才能工作,我只想让JArrays在1d以上工作。
import my_java_class
import numpy as np
my_java_class.initVM()
arr = np.ones(10)
# This makes a 1d JArray that can be later used by the java classes in my_java_class
j_arr = my_java_class.JArray('float')(arr)
arr_2d = np.ones((10,10))
# This fails since the nested lists can't be converted to a 2d JArray.
j_arr2d = my_java_class.JArray('float')(arr_2d)
我也尝试在JArrays中重新嵌入JArrays,就像jcc文档似乎那样,但这似乎也不起作用。
答案 0 :(得分:0)
至少对于双数组,您可以通过以下方式执行此操作:
a = JArray('double')(np.ones(3))
b = JArray('double')(np.ones(3))
ab = JArray('object')((a, b))
这会创建一个二维数组(尚未弄清楚如何使用张量)