我目前正在将一个用Python编写的程序移植到Java,并遇到了一些问题。我一次移植程序的一部分,为了测试目的,我正在使用JPype使其兼容新的Java类。
编辑:为了更清楚地说明,我目前正在处理的类为整个Python程序提供数据。
因此,在我的Java类中,我有一些存储在ArrayList中的float和byte值,
ArrayList<ArrayList<Float>> dataFloat = new ArrayList<ArrayList<Float>>();
ArrayList<ArrayList<Byte>> dataByte = new ArrayList<ArrayList<Byte>>();
然后通过使用JPype,我可以将这些内容传输到我的Python环境中,现在它的类型为
<class 'jpype._jclass.java.util.ArrayList'> .
现在我想在Python中将它们简单地转换为numpy数组。
numpy.array(dataFloat) .
一开始看起来好像行得通,印出来看着不错,
[[1.0 2.0 3.0]
[80.0 127.0 127.0]
[255.0 255.0 255.0]] .
然而,由于程序要求数值为浮点型,这并不能与程序的其余部分兼容。经过进一步研究,我发现我所拥有的这些“浮点数”实际上是 __________。(请填入具体内容)
<class 'jpype._jclass.java.lang.Float'>
而不是我想要的普通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'>
这里需要使用所需的浮点类型。
为了能够与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 in arr.get(j):
b = append(b, i.floatValue())
a = vstack((a, b))
当有成千上万个元素需要处理时,这当然需要很长时间。
有没有人知道如何高效地完成这项工作?简单来说,我从JPype获取了许多java.lang.Float值,需要将它们转换为常规的Python浮点数值。