Android使用chaquo框架从Java无法传数组给Python的Numpy的NDArray的问题,com.chaquo.python.PyException:
2021/8/3 1:06:14
本文主要是介绍Android使用chaquo框架从Java无法传数组给Python的Numpy的NDArray的问题,com.chaquo.python.PyException:,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
针对这个问题,我也是找了很久才找到答案,现在让我们来看看是如何解答的。
背景:
我的需求是在Android开发的项目中,需要获取蓝牙的数据然后通过chaquo传参数给深度学习的模型,模型得到一个resultcode返回给安卓端。
问题所在
深度学习开发的师兄提供给我preidict函数的接口,该函数用于预测行为。函数的参数是python中大名鼎鼎的numpy的NDArray对象,在本项目中要求是要20*3维的numpy数组,也就是:array[20][3]
第一次做法:
第一次我没想太多,我想着numpy对应的不也是数组嘛,所以我用java简单整理了数据发了一个float array[20][3]数组给python端,结果却爆了错。我第一次尝试的代码如下:
PyObject obj1 = py.getModule("Deployment").callAttr("predict" ,conbinedArray );
代码解析:其实就是调用了Deployment.py脚本下的predict方法,并且传了一个二维数组(20*3)conbinedArray
但噩梦此拉开帷幕。
报错
此时通过debug,try-catch等一系列操作下来发现,chaquo报TypeError错误如下(复制未完全)。
com.chaquo.python.PyException: TypeError: predict() takes 1 positional argument but 3 were given.
意思就是,这个函数仅仅接受一个参数,而我提供了3个。
疑问
这下子就会很纳闷了,predict函数确实是一个参数没错,但是是一个numpy的二维数组呀,我用java传一个二维数组过去难道不正确吗?
这个疑问一直伴随了我一天,后面搜到以下方法,能够解决这个问题。
解决方案
先贴代码
PyObject np = py.getModule("numpy"); // 初始化numpy模块 // 调用numpy.array()函数,例如numpy.array([1,2,3]) --> [1,2,3] PyObject conbined_final = np.callAttr("array",conbinedArray[0]); // 调用numpy.expand_dims(array,0 or 1)函数,例如 // numpy.expand_dims([1,2,3],0) --> [[1,2,3]] // numpy.expand_dims([1,2,3],1) --> [[1],[2],[3]] // 这个函数就是给array添加维度 conbined_final = np.callAttr("expand_dims", conbined_final, 0); //这个for循环就是把java中的二维数组中的每一行都转换为一个array例如[1,2,3] // 然后调用numpy的append方法,一个个添加到conbined_final数组中,我在后面放了张图片,大家可以理解一下 for (int i=1; i < conbinedArray.length; i++){ // 假设下面这行获得一个[[1,2,3]] PyObject temp_arr = np.callAttr("expand_dims", conbinedArray[i], 0); // 假设已存在conbined_final=[[6,6,6]] // 那么下面这行得到的结果就是[[6,6,6],[1,2,3]] //也就是说,我们用java代码调用python numpy库合成了一个predict的函数参数 conbined_final = np.callAttr("append", conbined_final, temp_arr, 0); } // 此时我们就可以放心大胆地把生成的对象发送给脚本了 PyObject obj1 = py.getModule("Deployment").callAttr("predict",conbined_final ); // 获取结果 int result = obj1.toJava(int.class);
谢谢大家的阅读,欢迎评论交流。
这篇关于Android使用chaquo框架从Java无法传数组给Python的Numpy的NDArray的问题,com.chaquo.python.PyException:的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-22项目:远程温湿度检测系统
- 2024-12-21《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》简介
- 2024-12-21后台管理系统开发教程:新手入门全指南
- 2024-12-21后台开发教程:新手入门及实战指南
- 2024-12-21后台综合解决方案教程:新手入门指南
- 2024-12-21接口模块封装教程:新手必备指南
- 2024-12-21请求动作封装教程:新手必看指南
- 2024-12-21RBAC的权限教程:从入门到实践
- 2024-12-21登录鉴权实战:新手入门教程
- 2024-12-21动态权限实战入门指南