传递NumPy数组到JPype,本章我们将启动一个Java虚拟机(JVM),并把一个NumPy数组发送到JVM。我们将使用标准的Java调用语法把接收到的数组打印出来。当然,你需要提前安装好Java。
具体步骤
首先,我们需要在JPype中启动JVM。
- 启动JVM。
JPype可以方便地找到默认的JVM路径。
jpype.startJVM(jpype.getDefaultJVMPath())
- 打印
hello world
。
出于对传统的尊重,先打印hello world
。
jpype.java.lang.System.out.println("hello world")
- 传递NumPy数组。
创建一个NumPy数组,把它转换为Python列表并传递给JPype。之后就可以轻松打印出各个数组元素。
values = numpy.arange(7)
java_array = jpype.JArray
(jpype.JDouble, 1)(values.tolist())
for item in java_array:
jpype.java.lang.System.out.println(item)
- 关闭JVM。
所有的事情都完成后,关闭JVM。
jpype.shutdownJVM()
在JPype中,任何时刻都只能有一个JVM正在运行。如果忘记关闭JVM,有可能导致意想不到的错误。程序的输出如下。
hello world
0.0
1.0
2.0
3.0
4.0
5.0
6.0
JVM activity report :
classes loaded : 31
JVM has been shutdown
本章的完整代码如下。
import jpype
import numpy
#1. 启动JVM
jpype.startJVM(jpype.getDefaultJVMPath())
#2. 打印hello world
jpype.java.lang.System.out.println("hello world")
#3. 传递NumPy数组
values = numpy.arange(7)
java_array = jpype.JArray(jpype.JDouble, 1)(values.tolist())
for item in java_array:
jpype.java.lang.System.out.println(item)
#4. 关闭JVM
jpype.shutdownJVM()
小结
JPype允许我们启动和停止一个Java虚拟机。JPype提供了对标准Java API调用的封装。本例中,我们通过使用JArray
封装,可以把Python列表传递到JVM并转换为Java数组。JPype使用了Java本地接口(JNI)。JNI实现了本地原生C语言代码和Java之间的桥接。遗憾的是,使用JNI会导致软件性能降低,因此使用JPype的时候要考虑到这一点。