python 将 type c_ubyte_Array 的数据保存为 .data 格式的文件

时间: 2024-09-30 11:13:42 浏览: 39
在Python中,如果你有一个`c_ubyte_Array`类型的数组,它通常是来自于像C或C++这样的语言的结构化数据,想要将其保存为`.data`格式文件,通常是指二进制文件。可以使用内置的`struct`模块来进行序列化操作。首先,你需要确定数组的大小以及元素在内存中的排列方式(是否是字节对齐),然后按照指定的格式字符串将数据打包。 下面是一个简单的步骤示例: ```python import struct # 假设你有如下c_ubyte_Array变量 c_ubyte_array = [0x01, 0x02, 0x03, 0x04, ...] # 需要替换为实际的二进制数据 # 获取数组的总长度(假设每个元素占用1个字节) array_length = len(c_ubyte_array) file_format = 'B' * array_length # 使用'>'表示大端字节序,如果是小端字节序则用'<' # 创建一个新的bytes对象 byte_data = struct.pack(file_format, *c_ubyte_array) # 写入到.data文件中 with open('output.data', 'wb') as f: f.write(byte_data) ``` 在这个例子中,`'B'*array_length`指定了每个元素都是一个8位无符号整数(`c_ubyte`)。你可以根据实际需要修改`file_format`。
相关问题

class VCI_INIT_CONFIG(Structure): _fields_ = [("AccCode", c_uint), ("AccMask", c_uint), ("Reserved", c_uint), ("Filter", c_ubyte), ("Timing0", c_ubyte), ("Timing1", c_ubyte), ("Mode", c_ubyte) ] class VCI_CAN_OBJ(Structure): _fields_ = [("ID", c_uint), ("TimeStamp", c_uint), ("TimeFlag", c_ubyte), ("SendType", c_ubyte), ("RemoteFlag", c_ubyte), ("ExternFlag", c_ubyte), ("DataLen", c_ubyte), ("Data", c_ubyte*8), ("Reserved", c_ubyte*3) ] class VCI_CAN_OBJ_ARRAY(Structure): _fields_ = [('SIZE', c_uint16), ('STRUCT_ARRAY', POINTER(VCI_CAN_OBJ))] def __init__(self,num_of_structs): #这个括号不能少 self.STRUCT_ARRAY = cast((VCI_CAN_OBJ * num_of_structs)(),POINTER(VCI_CAN_OBJ))#结构体数组 self.SIZE = num_of_structs#结构体长度 self.ADDR = self.STRUCT_ARRAY[0]#结构体数组地址 byref()转c地址 转换为C语言

这段代码中使用了Python的ctypes库来定义C语言中的结构体和数组。在C语言中,结构体和数组都是一种内存布局,因此在使用ctypes库时,需要通过定义结构体的_fields_属性来指定结构体中各成员的类型和名称,同时使用POINTER()来定义结构体数组,并通过cast()将其转换为指向结构体的指针类型。在初始化函数中,通过self.STRUCT_ARRAY和self.SIZE分别存储结构体数组的地址和长度,并使用byref()将其转换为C语言中的地址类型。这样,就可以在Python中定义C语言的数据结构,并将其传递给C语言程序进行操作。

# -*- coding: utf-8 -*- """ Transform the data type from ascii to ubyte format (8 bits unsigned binary) and save to new files, which would reduce the data size to 1/3, and would save the data transforming time when read by the python @author: Marmot """ import numpy as np import time from itertools import islice import pandas as pd # data_folder = '../../data/' set_list = ['train','testA','testB'] size_list = [10000,2000,2000] time1= time.time() for set_name,set_size in zip(set_list,size_list): output_file = data_folder + set_name + '_ubyte.txt' f = open(output_file, "w") f.close() Img_ind = 0 input_file = data_folder + set_name +'.txt' with open(input_file) as f: for content in f: Img_ind = Img_ind +1 print('transforming ' + set_name + ': ' + str(Img_ind).zfill(5)) line = content.split(',') title = line[0] + ' '+line[1] data_write = np.asarray(line[2].strip().split(' ')).astype(np.ubyte) data_write = (data_write + 1).astype(np.ubyte) if data_write.max()>255: print('too large') if data_write.min()<0: print('too small') f = open(output_file, "a") f.write(data_write.tobytes()) f.close() time2 = time.time() print('total elapse time:'+ str(time2- time1)) #%% generate train label list value_list =[] set_name = 'train' input_file = data_folder + set_name +'.txt' with open(input_file) as f: for content in f: line = content.split(',') value_list.append(float(line[1])) value_list = pd.DataFrame(value_list, columns=['value']) value_list.to_csv(data_folder + 'train_label.csv',index = False,header = False)

这段代码的主要功能是将数据集中的图像像素值从 ASCII 码转换为无符号 8 位二进制格式,并保存到新文件中,同时生成训练集标签列表。 代码首先定义了一个数据路径列表 `set_list` 和一个数据子集大小列表 `size_list`。然后通过循环遍历每个数据子集,对每个子集执行以下操作: 1. 定义了一个输出文件路径 `output_file`,并创建一个空文件; 2. 读取输入文件 `input_file`,遍历每个图像像素值,并将其转换为无符号 8 位二进制格式; 3. 将转换后的图像像素值写入输出文件中; 4. 遍历完成后,输出文件中将包含整个数据子集的所有图像像素值。 注意,代码中的 `data_folder` 变量指定了数据集所在的文件夹路径。 另外,代码的最后还生成了训练集标签列表。具体来说,代码读取训练集文件 `train.txt`,提取其中的标签信息,并将标签保存到一个 CSV 文件 `train_label.csv` 中,以供后续的模型训练使用。
阅读全文

相关推荐

import pickle import numpy as np import os # from scipy.misc import imread def load_CIFAR_batch(filename): with open(filename, 'rb') as f: datadict = pickle.load(f, encoding='bytes') X = datadict[b'data'] Y = datadict[b'labels'] X = X.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype("float") Y = np.array(Y) return X, Y def load_CIFAR10(ROOT): xs = [] ys = [] for b in range(1, 2): f = os.path.join(ROOT, 'data_batch_%d' % (b,)) X, Y = load_CIFAR_batch(f) xs.append(X) ys.append(Y) Xtr = np.concatenate(xs) Ytr = np.concatenate(ys) del X, Y Xte, Yte = load_CIFAR_batch(os.path.join(ROOT, 'test_batch')) return Xtr, Ytr, Xte, Yte def get_CIFAR10_data(num_training=5000, num_validation=500, num_test=500): cifar10_dir = r'D:\daima\cifar-10-python\cifar-10-batches-py' X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir) print(X_train.shape) mask = range(num_training, num_training + num_validation) X_val = X_train[mask] y_val = y_train[mask] mask = range(num_training) X_train = X_train[mask] y_train = y_train[mask] mask = range(num_test) X_test = X_test[mask] y_test = y_test[mask] mean_image = np.mean(X_train, axis=0) X_train -= mean_image X_val -= mean_image X_test -= mean_image X_train = X_train.transpose(0, 3, 1, 2).copy() X_val = X_val.transpose(0, 3, 1, 2).copy() X_test = X_test.transpose(0, 3, 1, 2).copy() return { 'X_train': X_train, 'y_train': y_train, 'X_val': X_val, 'y_val': y_val, 'X_test': X_test, 'y_test': y_test, } def load_models(models_dir): models = {} for model_file in os.listdir(models_dir): with open(os.path.join(models_dir, model_file), 'rb') as f: try: models[model_file] = pickle.load(f)['model'] except pickle.UnpicklingError: continue return models这是一个加载cifar10数据集的函数,如何修改使其能加载mnist数据集,不使用TensorFlow

X_train,T_train=idx2numpy.convert_from_file('emnist/emnist-letters-train-images-idx3-ubyte'),idx2numpy.convert_from_file('emnist/emnist-letters-train-labels-idx1-ubyte')转化为相同形式train_num = 60000 test_num = 10000 img_dim = (1, 28, 28) img_size = 784 def _download(file_name): file_path = dataset_dir + "/" + file_name if os.path.exists(file_path): return print("Downloading " + file_name + " ... ") urllib.request.urlretrieve(url_base + file_name, file_path) print("Done") def download_mnist(): for v in key_file.values(): _download(v) def _load_label(file_name): file_path = dataset_dir + "/" + file_name print("Converting " + file_name + " to NumPy Array ...") with gzip.open(file_path, 'rb') as f: labels = np.frombuffer(f.read(), np.uint8, offset=8) print("Done") return labels def _load_img(file_name): file_path = dataset_dir + "/" + file_name print("Converting " + file_name + " to NumPy Array ...") with gzip.open(file_path, 'rb') as f: data = np.frombuffer(f.read(), np.uint8, offset=16) data = data.reshape(-1, img_size) print("Done") return data def _convert_numpy(): dataset = {} dataset['train_img'] = _load_img(key_file['train_img']) dataset['train_label'] = _load_label(key_file['train_label']) dataset['test_img'] = _load_img(key_file['test_img']) dataset['test_label'] = _load_label(key_file['test_label']) return dataset def init_mnist(): download_mnist() dataset = _convert_numpy() print("Creating pickle file ...") with open(save_file, 'wb') as f: pickle.dump(dataset, f, -1) print("Done!") def _change_one_hot_label(X): T = np.zeros((X.size, 10)) for idx, row in enumerate(T): row[X[idx]] = 1 return T def load_mnist(normalize=True, flatten=True, one_hot_label=False): """读入MNIST数据集 Parameters ---------- normalize : 将图像的像素值正规化为0.0~1.0 one_hot_label : one_hot_label为True的情况下,标签作为one-hot数组返回 one-hot数组是指[0,0,1,0,0,0,0,0,0,0]这样的数组 flatten : 是否将图像展开为一维数组 Returns ------- (训练图像, 训练标签), (测试图像, 测试标签) """ if not os.path.exists(save_file): init_mnist() with open(save_file, 'rb') as f: dataset = pickle.load(f) if normalize: for key in ('train_img', 'test_img'): dataset[key] = dataset[key].astype(np.float32) dataset[key] /= 255.0 if one_hot_label: dataset['train_label'] = _change_one_hot_label(dataset['train_label']) dataset['test_label'] = _change_one_hot_label(dataset['test_label']) if not flatten: for key in ('train_img', 'test_img'): dataset[key] = dataset[key].reshape(-1, 1, 28, 28) return (dataset['train_img'], dataset['train_label']), (dataset['test_img'], dataset['test_label']) if name == 'main': init_mnist()模仿这段代码将获取同样形式

最新推荐

recommend-type

数据库基础测验20241113.doc

数据库基础测验20241113.doc
recommend-type

微信小程序下拉选择组件

微信小程序下拉选择组件
recommend-type

DICOM文件+DX放射平片-数字X射线图像DICOM测试文件

DICOM文件+DX放射平片—数字X射线图像DICOM测试文件,文件为.dcm类型DICOM图像文件文件,仅供需要了解DICOM或相关DICOM开发的技术人员当作测试数据或研究使用,请勿用于非法用途。
recommend-type

Jupyter Notebook《基于双流 Faster R-CNN 网络的 图像篡改检测》+项目源码+文档说明+代码注释

<项目介绍> - 基于双流 Faster R-CNN 网络的 图像篡改检测 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
recommend-type

使用epf捕获没有CA证书的SSLTLS明文(LinuxAndroid内核支持amd64arm64).zip

c语言
recommend-type

黑板风格计算机毕业答辩PPT模板下载

资源摘要信息:"创意经典黑板风格毕业答辩论文课题报告动态ppt模板" 在当前数字化教学与展示需求日益增长的背景下,PPT模板成为了表达和呈现学术成果及教学内容的重要工具。特别针对计算机专业的学生而言,毕业设计的答辩PPT不仅仅是一个展示的平台,更是其设计能力、逻辑思维和审美观的综合体现。因此,一个恰当且创意十足的PPT模板显得尤为重要。 本资源名为“创意经典黑板风格毕业答辩论文课题报告动态ppt模板”,这表明该模板具有以下特点: 1. **创意设计**:模板采用了“黑板风格”的设计元素,这种风格通常模拟传统的黑板书写效果,能够营造一种亲近、随性的学术氛围。该风格的模板能够帮助展示者更容易地吸引观众的注意力,并引发共鸣。 2. **适应性强**:标题表明这是一个毕业答辩用的模板,它适用于计算机专业及其他相关专业的学生用于毕业设计课题的汇报。模板中设计的版式和内容布局应该是灵活多变的,以适应不同课题的展示需求。 3. **动态效果**:动态效果能够使演示内容更富吸引力,模板可能包含了多种动态过渡效果、动画效果等,使得展示过程生动且充满趣味性,有助于突出重点并维持观众的兴趣。 4. **专业性质**:由于是毕业设计用的模板,因此该模板在设计时应充分考虑了计算机专业的特点,可能包括相关的图表、代码展示、流程图、数据可视化等元素,以帮助学生更好地展示其研究成果和技术细节。 5. **易于编辑**:一个良好的模板应具备易于编辑的特性,这样使用者才能根据自己的需要进行调整,比如替换文本、修改颜色主题、更改图片和图表等,以确保最终展示的个性和专业性。 结合以上特点,模板的使用场景可以包括但不限于以下几种: - 计算机科学与技术专业的学生毕业设计汇报。 - 计算机工程与应用专业的学生论文展示。 - 软件工程或信息技术专业的学生课题研究成果展示。 - 任何需要进行学术成果汇报的场合,比如研讨会议、学术交流会等。 对于计算机专业的学生来说,毕业设计不仅仅是完成一个课题,更重要的是通过这个过程学会如何系统地整理和表述自己的思想。因此,一份好的PPT模板能够帮助他们更好地完成这个任务,同时也能够展现出他们的专业素养和对细节的关注。 此外,考虑到模板是一个压缩文件包(.zip格式),用户在使用前需要解压缩,解压缩后得到的文件为“创意经典黑板风格毕业答辩论文课题报告动态ppt模板.pptx”,这是一个可以直接在PowerPoint软件中打开和编辑的演示文稿文件。用户可以根据自己的具体需要,在模板的基础上进行修改和补充,以制作出一个具有个性化特色的毕业设计答辩PPT。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

提升点阵式液晶显示屏效率技术

![点阵式液晶显示屏显示程序设计](https://iot-book.github.io/23_%E5%8F%AF%E8%A7%81%E5%85%89%E6%84%9F%E7%9F%A5/S3_%E8%A2%AB%E5%8A%A8%E5%BC%8F/fig/%E8%A2%AB%E5%8A%A8%E6%A0%87%E7%AD%BE.png) # 1. 点阵式液晶显示屏基础与效率挑战 在现代信息技术的浪潮中,点阵式液晶显示屏作为核心显示技术之一,已被广泛应用于从智能手机到工业控制等多个领域。本章节将介绍点阵式液晶显示屏的基础知识,并探讨其在提升显示效率过程中面临的挑战。 ## 1.1 点阵式显
recommend-type

在SoC芯片的射频测试中,ATE设备通常如何执行系统级测试以保证芯片量产的质量和性能一致?

SoC芯片的射频测试是确保无线通信设备性能的关键环节。为了在量产阶段保证芯片的质量和性能一致性,ATE(Automatic Test Equipment)设备通常会执行一系列系统级测试。这些测试不仅关注芯片的电气参数,还包含电磁兼容性和射频信号的完整性检验。在ATE测试中,会根据芯片设计的规格要求,编写定制化的测试脚本,这些脚本能够模拟真实的无线通信环境,检验芯片的射频部分是否能够准确处理信号。系统级测试涉及对芯片基带算法的验证,确保其能够有效执行无线信号的调制解调。测试过程中,ATE设备会自动采集数据并分析结果,对于不符合标准的芯片,系统能够自动标记或剔除,从而提高测试效率和减少故障率。为了
recommend-type

CodeSandbox实现ListView快速创建指南

资源摘要信息:"listview:用CodeSandbox创建" 知识点一:CodeSandbox介绍 CodeSandbox是一个在线代码编辑器,专门为网页应用和组件的快速开发而设计。它允许用户即时预览代码更改的效果,并支持多种前端开发技术栈,如React、Vue、Angular等。CodeSandbox的特点是易于使用,支持团队协作,以及能够直接在浏览器中编写代码,无需安装任何软件。因此,它非常适合初学者和快速原型开发。 知识点二:ListView组件 ListView是一种常用的用户界面组件,主要用于以列表形式展示一系列的信息项。在前端开发中,ListView经常用于展示从数据库或API获取的数据。其核心作用是提供清晰的、结构化的信息展示方式,以便用户可以方便地浏览和查找相关信息。 知识点三:用JavaScript创建ListView 在JavaScript中创建ListView通常涉及以下几个步骤: 1. 创建HTML的ul元素作为列表容器。 2. 使用JavaScript的DOM操作方法(如document.createElement, appendChild等)动态创建列表项(li元素)。 3. 将创建的列表项添加到ul容器中。 4. 通过CSS来设置列表和列表项的样式,使其符合设计要求。 5. (可选)为ListView添加交互功能,如点击事件处理,以实现更丰富的用户体验。 知识点四:在CodeSandbox中创建ListView 在CodeSandbox中创建ListView可以简化开发流程,因为它提供了一个在线环境来编写代码,并且支持实时预览。以下是使用CodeSandbox创建ListView的简要步骤: 1. 打开CodeSandbox官网,创建一个新的项目。 2. 在项目中创建或编辑HTML文件,添加用于展示ListView的ul元素。 3. 创建或编辑JavaScript文件,编写代码动态生成列表项,并将它们添加到ul容器中。 4. 使用CodeSandbox提供的实时预览功能,即时查看ListView的效果。 5. 若有需要,继续编辑或添加样式文件(通常是CSS),对ListView进行美化。 6. 利用CodeSandbox的版本控制功能,保存工作进度和团队协作。 知识点五:实践案例分析——listview-main 文件名"listview-main"暗示这可能是一个展示如何使用CodeSandbox创建基本ListView的项目。在这个项目中,开发者可能会包含以下内容: 1. 使用React框架创建ListView的示例代码,因为React是目前较为流行的前端库。 2. 展示如何将从API获取的数据渲染到ListView中,包括数据的获取、处理和展示。 3. 提供基本的样式设置,展示如何使用CSS来美化ListView。 4. 介绍如何在CodeSandbox中组织项目结构,例如如何分离组件、样式和脚本文件。 5. 包含一个简单的用户交互示例,例如点击列表项时弹出详细信息等。 总结来说,通过标题“listview:用CodeSandbox创建”,我们了解到本资源是一个关于如何利用CodeSandbox这个在线开发环境,来快速实现一个基于JavaScript的ListView组件的教程或示例项目。通过上述知识点的梳理,可以加深对如何创建ListView组件、CodeSandbox平台的使用方法以及如何在该平台中实现具体功能的理解。