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实现结构体的更多相关文章

  1. NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构

    本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存 ...

  2. numpy中结构数组

    在c语言中,我们可以使用关键字struct定义结构类型.和c语言一样,numpy也可以创建结构定义,这样可以很方便的读取二进制的C语言结构数组,将其转换为numpy数组对象,假设我们定义的结构数组如下 ...

  3. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  4. C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱

    一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...

  5. go语言结构体

    定义: 是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体. 成员: 每个值称为结构体的成员. 示例: 用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工编号.员工的名字. ...

  6. C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  7. C++_系列自学课程_第_12_课_结构体

    #include <iostream> #include <string> using namespace std; struct CDAccount { double bal ...

  8. java socket传送一个结构体给用C++编写的服务器解析的问题

    另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...

  9. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

随机推荐

  1. python实现文件下载的方法总结

    前端时间遇到一个通过url下载文件的需求,只需要简单的编写一个py脚本即可.从网上搜了下python实现文件下载的方法,总结如下,备查. 以下方法均已测试,环境win8.1  python2.6/2. ...

  2. matlab 在柱状图上 显示数字

    x = rand(100,1);[n,y] = hist(x);bar(y,n);for i = 1:length(y)text(y(i),n(i)+0.5,num2str(n(i)));end

  3. 病症:arm启动后应用程序界面显示…

    病症:病症:arm启动后应用程序界面显示不正常(左面有部分未能正常显示)也就是左面少一块区域,右面多一部, 原因:lcd显示驱动中场扫描的问题 平台:s3c2416.linux2.6.800*480l ...

  4. Redis搭建(五):Cluster集群搭建

    一.方案 1. 介绍 redis3.0及以上版本实现,集群中至少应该有奇数个节点,所以至少有三个节点,官方推荐三主三从的配置方式 使用哈希槽的概念,Redis 集群有16384个哈希槽,每个key通过 ...

  5. Apache与Tomcat联系及区别

    Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行.Apache是Web服务器而Tomcat是Java应用服务器. A ...

  6. mysql 主键

    什么是主键 表中的每一行都应该具有可以唯一标识自己的一列(或一组列).而这个承担标识作用的列称为主键. 任何列都可以作为主键,只要它满足以下条件: • 任何两行都不具有相同的主键值.就是说这列的值都是 ...

  7. 383. Ransom Note 在字典数组中查找笔记数组

    [抄题]: Given an arbitrary ransom note string and another string containing letters from all the magaz ...

  8. Solidity string to uint

    oraclize result以string格式返回,solidity没有uint(string)这样的强制转换功能,如果要解析其中的数字,可以用oraclize提供的parseInt方法: prag ...

  9. Struts中ActionContext和ServletActionContext的比较

    一.ActionContext在Struts2开发中除了将请求参数自动设置到Action的字段中,往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直 ...

  10. .html与.text的异同

    .html与.text的方法操作是一样,只是在具体针对处理对象不同 .html处理的是元素内容,.text处理的是文本内容 .html只能使用在HTML文档中,.text 在XML 和 HTML 文档 ...