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学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
随机推荐
- Mysql慢查询定位和优化实践分享
调优目标:提高io的利用率,减少无谓的io能力浪费. 1.打开慢查询日志定位慢sql: my.cnf: slow_query_log slow_query_log_file=mysql.slow lo ...
- 22-从零玩转JavaWeb-代码块
配套详解视频 局部代码块与初始化代码块 面向对象-静态代码块 代码块总结 组合关系与类的加载 静态代码块及字段初始化练习 一.什么是代码块 在类中或方法当中 使用{}括起来的一段代码 就称它是一个代码 ...
- Timer中的重要函数
- Android剖析和运行机制
Android剖析和运行机制 大纲: 1. Android剖析 Linux内核本地库(Native Libraries)Android运行时(Android Runtime)应用框架 2. Andro ...
- MSSQL列记录合并
创建表及插入数据 If OBJECT_ID(N'Demo') Is Not Null Begin Drop Table Demo End Else Begin Create Table Demo( A ...
- CSS 伪类与伪元素
CSS的元素选择器除了根据id(#).class(.).属性([ ])选取元素以外,还有很重要的一类,就是根据元素的特殊状态来选取元素.它们就是伪类和伪元素.跟id选择器.类选择器.属性选择器以及派生 ...
- Hyperledger Chaincode启动过程
Chaincode 启动过程 简介 这里讲的 Chaincode 是用户链码(User Chaincode,UCC),对应用开发者来说十分重要,它提供了基于区块链分布式账本的状态处理逻辑,基于它可以开 ...
- Django--model模型绑定_数据库操作
1.创建model类 app01/models.py 1 2 3 4 5 6 7 from django.db import models # Create your models here. c ...
- bzoj5392 [Lydsy1806月赛]路径统计
传送门 分析 我们设sum[x]为小于等于x的点现在有多少联通 于是一个序列合法当且只当sum[R]-sum[L-1]=len且所有点度数不大于2 我们知道如果对于序列[L,R]满足条件则[L+1,R ...
- PyV8在服务端运行自动崩溃问题
近来想在服务端架设WSGI + PyV8去自动解析JavaScript代码,然后返回解析后的数据给客户端.但是发现,在nginx配置后,客户端一请求,服务端的python脚本自动崩溃. 见代码: de ...