IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Android使用chaquo框架从Java无法传数组给Python的Numpy的NDArray的问题,com.chaquo.python.PyException: -> 正文阅读

[Python知识库]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);

谢谢大家的阅读,欢迎评论交流。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 11:08:04  更:2021-08-03 11:10:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 2:50:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码