【Numpy基础知识】字节交换

news2024/11/18 14:45:19

字节交换

来源:Numpy官网:https://numpy.org/doc/stable/user/basics.html

在这里插入图片描述

文章目录

    • 字节交换
        • 导包
        • 【1】字节排序和ndarrays 简介
        • 【2】更改字节顺序

导包

import numpy as np

【1】字节排序和ndarrays 简介

ndarray 是一个对象,它为内存中的数据提供 python 数组接口。

通常,要使用数组查看的内存与运行 Python 的计算机的字节顺序不同。

例如,我可能正在使用具有小端 CPU 的计算机(例如英特尔奔腾),但我已从大端计算机写入的文件中加载了一些数据。假设我从 Sun(大端序)计算机写入的文件中加载了 4 个字节。我知道这 4 个字节代表两个 16 位整数。在大端计算机上,双字节整数首先存储最高有效字节 (MSB),然后存储最低有效字节 (LSB)。因此,字节按内存顺序为:

  • MSB 整数 1
  • LSB 整数 1
  • MSB 整数 2
  • LSB 整数 2

假设两个整数实际上是 1 和 770。由于 770 = 256 * 3 + 2,因此内存中的 4 个字节将分别包含:0、1、3、2。 我从文件加载的字节将包含以下内容:

big_end_buffer = bytearray([0, 1, 3, 2])
print(big_end_buffer)
bytearray(b'\x00\x01\x03\x02')

我们可能希望使用 ndarray 来访问这些整数。在这种情况下,我们可以围绕这个内存创建一个数组,并告诉 numpy 有两个整数,它们是 16 位和大端序:

big_end_arr = np.ndarray(shape=(2,), dtype='>i2', buffer=big_end_buffer)
print(big_end_arr)
[  1 770]
big_end_arr[0]
1
big_end_arr[1]
770

请注意上面的 >i2 数组 dtype。>表示“大端序”(<是小端序),i2表示“有符号2字节整数”。例如,如果我们的数据表示单个无符号 4 字节小端整数,则 dtype 字符串将为 <u4.

little_end_u4 = np.ndarray(shape=(1,), dtype='<u4', buffer=big_end_buffer)
print(little_end_u4)
[33751296]
little_end_u4[0] == 1 * 256 ** 1 + 3 * 256 ** 2 + 2 * 256 ** 3
True

【妙啊】

【2】更改字节顺序

从介绍中可以想象,有两种方法可以影响数组的字节顺序与它正在查看的基础内存之间的关系:

  • 更改数组 dtype 中的字节顺序信息,以便它将基础数据解释为采用不同的字节顺序。这是 arr.newbyteorder() 的作用

  • 更改基础数据的字节顺序,使 dtype 解释保持原样。这就是arr.byteswap()所做的。

需要更改字节顺序的常见情况包括:

  • 数据和 dtype 字节序不匹配,并且希望更改 dtype,使其与数据匹配。

  • 数据和 dtype 字节序不匹配,并且希望交换数据以使它们与 dtype 匹配

  • 数据和 dtype 字节序匹配,但希望交换数据并且 dtype 反映这一点

① 数据与dtype字节序不匹配,更改dtype以匹配数据

先来一些错误的数据

wrong_end_dtype_arr = np.ndarray(shape=(2,), dtype='<i2', buffer=big_end_buffer)
print(wrong_end_dtype_arr)
[256 515]
wrong_end_dtype_arr[0]
256

这种情况的明显解决方法是更改 dtype,以便它给出正确的字节序:

fixed_end_dtype_arr = wrong_end_dtype_arr.newbyteorder()
print(fixed_end_dtype_arr)
[  1 770]
fixed_end_dtype_arr[0]
1

注意,数组在内存中没有更改:

fixed_end_dtype_arr.tobytes() == big_end_buffer
True

② 数据和类型字节序不匹配,更改数据以匹配 dtype

如果需要按特定顺序排列内存中的数据,则可能需要执行此操作。例如,我们可能要将内存写出到需要特定字节排序的文件中。

fixed_end_mem_arr = wrong_end_dtype_arr.byteswap()
fixed_end_mem_arr[0]
1

现在数组在内存中发生了变化:

fixed_end_mem_arr.tobytes() == big_end_buffer
False

③ 数据和 dtype 字节序匹配、交换数据和 dtype

您可能具有正确指定的数组 dtype,但您需要该数组在内存中具有相反的字节顺序,并且您希望 dtype 匹配,以便数组值有意义。在这种情况下,您只需执行前面的两个操作:

swapped_end_arr = big_end_arr.byteswap().newbyteorder()
swapped_end_arr[0]
1
swapped_end_arr.tobytes() == big_end_buffer
False

使用 ndarray astype 方法可以实现将数据转换为特定 dtype 和字节排序的更简单方法:

swapped_end_arr = big_end_arr.astype('<i2')
swapped_end_arr[0]
1
swapped_end_arr.tobytes() == big_end_buffer
False

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年,我的儿子刚从美国名校毕业,就失业了...

前不久&#xff0c;朋友圈里一篇名为《2023年&#xff0c;我的儿子刚从美国名校毕业&#xff0c;就失业了…》的文章火爆全网。 故事里的男孩出生于一个中产阶级家庭&#xff0c;从每年12万的幼儿园开始一路接受了优质教育&#xff0c;最终不负众望从美国前50名校的商学院毕业…

Ubuntu20.04LTS环境docker+cephadm方式部署Ceph 17.2.5

Ubuntu20.04LTS环境dockercephadm方式部署Ceph 17.2.51. 前言2. 环境准备2.1. 主机信息2.2. NTP时间同步2.3. 关闭 iptable 和 firewalld2.4. 关闭 SElinux2.5. 生成SSH证书&#xff0c;并分发到其他节点2.6. 依赖安装3. 安装部署Ceph17.2.53.1. 安装cephadm&#xff0c;拉取ce…

玩转ast- 手写babel插件篇

AST抽象语法树是什么&#xff1f;抽象语法树&#xff08;Abstract Syntax Tree&#xff0c;AST&#xff09;是源代码语法结构的一种抽象表示它以树状的形式表现编程语言的语法结构&#xff0c;树上的每个节点都表示源代码中的一种结构每个包含type属性的数据结构&#xff0c;都…

基于Amlogic T972:结合DTS、驱动、Datasheet,解析Pinctrl子系统、GPIO脚的复用方法

文章目录前言一、概念1.1 Pinctrl devices1.2 Pinctrl client devices二、例&#xff08;1&#xff09;GPIOZ_9/10 复用为 i2c2_z2.1 Pin controller devices2.1.1 设备树配置: dts2.1.2 源码&#xff1a;驱动配置2.1.3 Datasheet2.2 Pinctrl client devices2.2.1 设备树配置&a…

华为云桌面,开启云上高效办公之旅!

在传统办公模式中&#xff0c;企业必须自己购买服务器和数据库软件才能进行日常管理&#xff0c;部署繁琐&#xff0c;还需要日常运维。而云桌面办公系统通过将传统的计算机终端与云计算平台有机地结合起来&#xff0c;使企业能够轻松应对各种变化带来的威胁和压力。 其中华为云…

用户与技术双向推动,小游戏赛道迎来新一轮增长机会

2017 年 12 月 28 日&#xff0c;微信小游戏正式上线。“跳一跳”刷爆了微信朋友圈&#xff0c;随后欢乐斗地主、坦克大战、纪念碑谷、拳皇等经典游戏纷纷出现在小游戏平台上。在过去的5年间&#xff0c;各大平台纷纷紧跟微信的步伐&#xff0c;纷纷入局小游戏&#xff0c;当前…

回调函数的基本使用

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、什么是回调函数二、为什么要…

打开新世界大门,测试人可以用Chrome插件干什么?

什么是Chrome插件 这篇文章所说的Chrome插件&#xff0c;也就是我们通常说的Chrome扩展 (Chrome Extension)&#xff0c;是一个用Web技术开发、用来增强浏览器功能的软件&#xff0c;它其实就是一个由 HTML、CSS、JS、图片等资源组成的一个 .crx 后缀的压缩包。 让我们来看看…

Android12屏下指纹解析

版权声明&#xff1a;本文为梦想全栈程序猿原创文章&#xff0c;转载请附上原文出处链接和本声明 前言&#xff1a;google官方更新了Android12的指纹架构&#xff0c;新添加了关于屏下指纹(屏下光学跟屏下超声波)的支持&#xff0c; 刚好近期要研究这个&#xff0c;想把自己的…

移动硬盘安装ubuntu系统二——启动U盘安装

一. 简介 在之前的一篇文章中记录了使用VMware Workstation给移动硬盘中安装Ubuntu系统过程&#xff0c;本篇文章简单记录使用启动盘安装 Ubuntu 20.04.5系统到移动硬盘。 二. 制作Ubuntu镜像的系统启动盘 按照官网 Install Ubuntu desktop上介绍&#xff0c;在 Windows 上可…

【Transformer】——李宏毅机器学习笔记

Transformer 前言 transformer是一个sequence-to-sequence(seq2seq) 的 model input a sequence&#xff0c;output a sequence. The output length is determined by model. 例如 语音辨识&#xff1a; 那么为什么不能把以上三种模型结合起来&#xff0c;进行语音识别呢&…

代码随想录拓展day3 922. 按奇偶排序数组II;24. 两两交换链表中的节点;234.回文链表;143.重排链表

代码随想录拓展day3 922. 按奇偶排序数组II&#xff1b;24. 两两交换链表中的节点&#xff1b;234.回文链表&#xff1b;35.搜索插入位置 数组和链表的题目。链表的操作几天没看又忘了&#xff0c;果然是要及时复习加反复复习。 922. 按奇偶排序数组II 922. 按奇偶排序数组 …

【小程序】宿主环境之通信模型和运行机制

目录 宿主环境 1. 什么是宿主环境 2. 小程序的宿主环境 通行模型 1. 通信的主体 2. 小程序的通信模型 运行机制 5. 小程序启动的过程 6. 页面渲染的过程 宿主环境 1. 什么是宿主环境 宿主环境&#xff08;host environment&#xff09;指的是程序运行所必须的依赖环…

论文笔记Point·E: A System for Generating 3D Point Clouds from Complex Prompts

之前的文本生成3D模型的方法生成一个模型需要多块GPU跑好几个小时&#xff0c;该文章提出的方法生成一个3D模型只需要单GPU1-2分钟。 该文章生成的3D模型的质量并不是当下最好的&#xff0c;但是生成速度很快&#xff0c;因此在现实中很有意义。 从文本生成3D模型的过程分为三…

Redis 对象

在 Redis底层数据结构介绍1 中我们介绍了Redis用到的所有主要数据结构&#xff0c;比如简单动态字符串&#xff08;SDS&#xff09;、双端链表、字典、压缩列表、整数集合等等。Redis并没有直接使用这些数据结构来实现键值对数据库&#xff0c;而是基于这些数据结构创建了一个对…

第7章 数据库设计和ER模型

第7章 数据库设计和ER模型 考试范围 7.1-7.7 考试题型&#xff1a;数据库设计题 考试内容&#xff1a; 掌握基本ER模型的概念与ER图的设计&#xff1b; 掌握将ER模型转换成关系模式的方法。 1、掌握基本ER模型的概念与ER图的设计 概念 E-R 模型是数据库设计中广泛使用的数…

2022-金盾信安杯

web 有来无回 考察xxe盲注 参考博客&#xff1a;https://blog.csdn.net/m0_49623330/article/details/113641498 <!ENTITY % a SYSTEM "http://vps/test.dtd"> %a; ] > 在自己服务器上编写dtd文件 <!ENTITY % dtd "<!ENTITY % hack SYSTEM ht…

零基础小白如何提高学Python的效率?

Python在所有的编成语言对小白来说是最友好的一种语言&#xff0c;简单、清晰、易学&#xff0c;但是有句话说万事开头难&#xff0c;对于很多连计算机基础都没有的伙伴来说&#xff0c;Python学习的效率极其低&#xff0c;这也导致了一部分放弃学习Python。 为了能够解决大家…

Android MAT的使用

下载与配置 MAT下载地址&#xff1a; Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation JAVA 11下载地址&#xff1a; Java Downloads | Oracle 由于最新版的MAT还需要JAVA 11&#xff0c;所以还需要配置JAVA 11的环境。 JAVA 11环境配置&#xff…

ssm药店药品进销存管理系统idea maven mysql

任何系统都要遵循系统设计的基本流程&#xff0c;本系统也不例外&#xff0c;同样需要经过市场调研&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试这些步骤&#xff0c;基于JSP技术、SSM框架、B/S机构、Mysql数据库设计并实现…