我有一些我试图从 python 访问的 java 类(不是我写的)。我已经用 JCC 成功编译了它们,并且可以毫无问题地访问这些方法。我可以调用一个需要 numpy 1D 数组(或列表,它们是相同的)的方法,但我不知道如何创建一个 2D 或 3D 的 JArray 来提供给代码。
似乎由于numpy数组是嵌入式列表,它们不能直接转换为JArrays。JCC 文档试图解释如何做到这一点,但它完全晦涩难懂。
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 文档似乎做的那样,但这似乎也不起作用。