5、用Numpy实现结构体
1、结构数组:
在C语言中我们可以通过struct关键字定义结构类型,结构中的字段占据连续的内存空间,每个结构体占用的内存大小都相同,因此可以很容易地定义结构数组。和C语言一样,在NumPy中也很容易对这种结构数组进行操作。只要NumPy中的结构定义和C语言中的定义相同,NumPy就可以很方便地读取C语言的结构数组的二进制数据,转换为NumPy的结构数组。
假如我们需要创建的C语言的结构如下图:
struct cal_ctrl{
u16 ifrm_width;
u16 ifrm_height;
u8 conv_size ;
bool conv_pad ;
u8 conv_std ;
u16 ifrm_num ;
u32 ifrm_bsptr ;
bool relu_en;
bool res_en;
bool pool_en;
u32 convp_bsptr;
u32 convk_bsptr;
u32 res_bsptr;
bool dw_en;
bool dw_pad;
u8 dw_std;
u32 dwp_bsptr;
bool dw_relu_en;
u16 ofrm_width;
u16 ofrm_height;
u16 ofrm_num;
u32 ofrm_bsptr;
bool conv_end ;
};
本结构体为我的一个项目中用到的部分宏定义没有给出
现在使用python中的numpy实现这个结构体:
cal_ctrl = np.dtype({'names':['ifrm_width',#图片宽度 y
'ifrm_height',#图片长度 y
'conv_size',#卷积核大小最大3*3 y
'conv_pad',#是否有零填充 y
'conv_std',#卷积步长 y
'ifrm_num',#计算一个输出帧(feature map)需要多少个输入帧。从1计数。需要是8的整数倍。 y
'ifrm_bsptr',#存放所有输入帧基地址的DDR地址指针。(*iframe_base_ptr)指向的DDR空间依次存放各个输入帧。 t
'relu_en',#当为为TRUE第一层卷积输出为【0~127】:当为Flash第一层卷积输出为【-】
'res_en',#当为TRUE feature map层累加功能,累加后再做Relu:当为Flashfeature map层累加功能
'pool_en',#第一次2*2最大池化标准位
'convp_bsptr',#存放卷积计算的滤波系数的地址指针。W t
'convk_bsptr',#存放卷积计算的K参数(每个输出帧的bias)的地址指针。b t
'res_bsptr',#存放Feature map累加层的数据的地址指针。 t
#----------------------second depth wise conv----------------------
'dw_en',#Depth wise 卷积使能。
'dw_pad',#True 零填充,Flash不需要填充
'dw_std',#步长
'dwp_bsptr',#存放Depth wise卷积计算的滤波系数的地址指针。包含K参数(每个输出帧的bias)。
'dw_relu_en',#1'b1:使能Relu,第二层卷积输出为[0~127]的整数;1'b0:不使能,第二层卷积输出为[-128~127]的整数。
#-------------------------- frame output ctrl-------------------------
'ofrm_width',#输出帧的宽
'ofrm_height',#输出帧的长
'ofrm_num',#输出帧的通道数
'ofrm_bsptr',#输出帧地址指针
'conv_end'],#继续去读conv common ctrl info队列,进行卷积计算。1:卷积计算结束,发出中断。
'formats':[np.uint16,np.uint16,np.uint8 ,bool,np.uint8,np.uint16,np.uint32,bool,bool,bool,np.uint32,np.uint32,np.uint32,
bool,bool,np.uint8,np.uint32,bool,np.uint16,np.uint16,np.uint16,np.uint32,bool]},align=True)#结构体中数据类型
在这段代码中使用np.dtype来创建结构的每个字段,并且对每个字段的类型进行初始化类型,
可以使用下面的代码来添加实例;
a = np.array([(......),(.......)],
dtype=cal_ctrl) #或者
a= np.empty((1), dtype=cal_ctrl)#创建了一个空的实例 #可以使用numpy创建数组的方法来创建它的实例,需要自创建数组的函数中加dtype=cal_ctrl
可以使用a.dtype来查看结构的数据类型
a[0][''ifrm_num''] = 45
#通过a[][]来修改或者访问结构的属性。
使用下面的代码可以将python结构装换为bin二进制文件来提供给C语言使用
a.tofile("test.bin")
内存对其问题:
C语言的结构体为了内存寻址方便,会自动的添加一些填充用的字节,这叫做内存对齐。例如如果把下面的name[32]改为name[30]的话,由于内存对齐问题,在name和age中间会填补两个字节,最终的结构体大小不会改变。因此如果numpy中的所配置的内存大小不符合C语言的对齐规范的话,将会出现数据错位。为了解决这个问题,在创建dtype对象时,可以传递参数align=True,这样numpy的结构数组的内存对齐和C语言的结构体就一致了。
利用下面的C语言可以把二进制文件读出来:
#include <stdio.h> struct person
{
char name[32];
int age;
float weight;
}; struct person p[2]; void main ()
{
FILE *fp;
int i;
fp=fopen("test.bin","rb");
fread(p, sizeof(struct person), 2, fp);
fclose(fp);
for(i=0;i<2;i++)
printf("%s %d %f\n", p[i].name, p[i].age, p[i].weight);
getchar();
}
5、用Numpy实现结构体的更多相关文章
- NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构
本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存 ...
- numpy中结构数组
在c语言中,我们可以使用关键字struct定义结构类型.和c语言一样,numpy也可以创建结构定义,这样可以很方便的读取二进制的C语言结构数组,将其转换为numpy数组对象,假设我们定义的结构数组如下 ...
- Go结构体实现类似成员函数机制
Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...
- C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱
一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...
- go语言结构体
定义: 是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体. 成员: 每个值称为结构体的成员. 示例: 用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工编号.员工的名字. ...
- C语言中的结构体
用户自己建立自己的结构体类型 1. 定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...
- C++_系列自学课程_第_12_课_结构体
#include <iostream> #include <string> using namespace std; struct CDAccount { double bal ...
- java socket传送一个结构体给用C++编写的服务器解析的问题
另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
随机推荐
- Elasticsearch之head插件安装之后的浏览详解
前提, Elasticsearch之插件介绍及安装 https://i.cnblogs.com/posts?categoryid=950999&page=2 (强烈建议,从头开始看) 比如, ...
- wpa_supplicant移植与使用(转)
下载wpa_supplicant最新版和openssl(编译wpa_supplicant需要openssl的库) 我这里使用的是wpa_supplicant-0.7.3.tar.gz和openssl- ...
- Neo4j的集群架构
Neo4j的集群架构 参考资料: 1.http://lib.csdn.net/article/mysql/5742,其中有集群的集中模式master-slave.sharding.多主模式.cassa ...
- xcode恢复语法高亮
[xcode恢复语法高亮] 非常简单,在Organizer中删除derivedData.
- Javamelody部署手册
Javamelody部署手册 1. Javamelody下载 下载地址:http://code.google.com/p/javamelody/downloads/list(注:需要FQ才能打开下载 ...
- 在VMware中为Red Hat配置静态ip并可访问网络-Windows下的VMware
首先确保虚拟网卡(VMware Network Adapter VMnet8)是开启的,然后在windows的命令行里输入“ipconfig /all”,找到VMware Network Adapte ...
- js,javascript生成 UUID的四种方法
全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...
- Redis02 Redis客户端之Java、连接远程Redis服务器失败
1 查看支持Java的redis客户端 本博文采用 Jedis 作为redis客户端,采用 commons-pool2 作为连接redis服务器的连接池 2 下载相关依赖与实战 2.1 到 Repos ...
- 28. LAST() 函数
LAST() 函数 LAST() 函数返回指定的字段中最后一个记录的值. 提示:可使用 ORDER BY 语句对记录进行排序. SQL LAST() 语法 SELECT LAST(column_nam ...
- python之连接oracle数据库
环境: windows,python2.7 1.下载cx_Oracle 在windows下不要使用easy_install或者pip,因为这样安装不会同步环境,并报错: distutils.error ...