我目前正在将用Python编写的程序移植到Java中并遇到了一些问题.我正在移植程序的一部分,为了测试目的,我正在使用JPype使它与新的java类兼容.
编辑:为了使事情更清楚,我正在处理的类为Python程序的其余部分提供数据.
所以,在我的java类中,我在ArrayLists中有一些float和byte值,
ArrayList<ArrayList<Float>> dataFloat = new ArrayList<ArrayList<Float>>();
ArrayList<ArrayList<Byte>> dataByte = new ArrayList<ArrayList<Byte>>();
Run Code Online (Sandbox Code Playgroud)
然后使用JPype我能够将这些内容放入我现在拥有该类型的Python环境中
<class 'jpype._jclass.java.util.ArrayList'> .
Run Code Online (Sandbox Code Playgroud)
现在我想简单地将这些转换为Python中的numpy数组,
numpy.array(dataFloat) .
Run Code Online (Sandbox Code Playgroud)
一开始似乎起作用,因为它打印出来时看起来不错,
[[1.0 2.0 3.0]
[80.0 127.0 127.0]
[255.0 255.0 255.0]] .
Run Code Online (Sandbox Code Playgroud)
但是,它不能与程序的其余部分一起使用,因为它要求值为float类型.进一步研究这个问题,我发现我拥有的这些"浮动"值实际上就是这样
<class 'jpype._jclass.java.lang.Float'>
Run Code Online (Sandbox Code Playgroud)
而不是我想要的常规Python浮点数.与常规numpy浮点数组相比,
>>> b = array([[1.1, 2.1, 3.1], [4.1, 5.1, 6.1], [7.1, 8.1, 9.1]])
>>> type((b[0])[0])
<type 'numpy.float64'>
Run Code Online (Sandbox Code Playgroud)
它具有所需的浮动类型.
为了能够使用Python程序的其余部分运行它,我必须使用java Float.floatValue()转换每个元素的数组,
arr = numpy.array(dataFloat)
a = array([])
for j in range(len(arr)):
b = array([])
if array_equal(a,[]):
for i in arr.get(j):
a = append(a, i.floatValue())
else:
for i …Run Code Online (Sandbox Code Playgroud) 我需要列表的二维矩阵,例如ArrayList,我想知道在这种情况下最优选的是什么.它只需要4x4的大小.
我应该使用类似的东西吗?
ArrayList[][] foo = new ArrayList[4][4];
Run Code Online (Sandbox Code Playgroud)
要么
ArrayList<SomeClass>[][] foo = new ArrayList[4][4];
Run Code Online (Sandbox Code Playgroud)
并在for循环中初始化具有适当类型的每个元素
ArrayList<ArrayList<ArrayList<SomeClass>>> foo = ArrayList<ArrayList<ArrayList<SomeClass>>>();
Run Code Online (Sandbox Code Playgroud)
第一种方法生成警告,例如它应该是参数化的,如果我添加使用第二种,我得到未经检查的转换警告.但是,如果我循环遍历元素并初始化它们,即使我仍然收到警告,也应该没有任何问题?最后一种方法不产生任何警告,可能工作正常,但感觉有点混乱.
编辑:我的问题得到了一些很好的答案,即使它有点不清楚.但它基本上是如何制作一个列表.创建一个自定义类来处理行/列使它变得更容易.