Python numpy之字节交换

1,278 阅读2分钟

image.png

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战

前言

Python numpy 模块中最核心的是ndarray 对象。 ndarray 对象有如下几个特点:

  • ndarray 要求元素数据类型都是同类型的,并且每个元素占用相同大小的内存块。
  • ndarray 存储的数据在计算机底层硬盘内存中是连续的一段存储空间

ndarray 包含两部分:

  • metdata :存放数组类型dtype、数组维度ndim、维度数量shape、维间距strides等
  • raw data:存放原始数据data

通常情况,raw data存储数据的内存与运行的Python的计算机的字节顺序不同。

因此,ndarray 数组中数据存储地址会发生变化,因此本期会涉及numpy 新概念字节交换。

1. 字节序列模式

  • 什么是字节交换?

    众所周知,在所有计算器内存中,对于多字节对象都是以连续的字节序列进行存储的。

    字节排序是一个对象,为darray内存中的数据提供Python数组接口。

    字节排序存在跨越多字节的程序对象的存储规则,主要分为大端模式小端模式

  • 大端模式:

    • 大端模式英文名称为Big-Endian

    • 把高位字节排放在低地址端,低位字节放在高地址端

    • 大端模式符合人阅读习惯,从低到高进行排列

    image.png

  • 小端模式:

    • 小端模式英文名为Little-Endian

    • 把低位字节排放到内存地址低地址端,高位字节放在内存高地址端

    image.png

  • 大小端模式优势:

    • 大端模式: 对符号位的固定为第一个字节,易判断正负
    • 小端模式: 强制转换数据,不需要调整的字节内容。

2. 更改字节顺序

对于 numpy 数组的字节顺序与其底层的内存之前关系存在两种:

  • arr.newbyteorder() 可以更改数组dtype中的字节顺序信息,以便将基础数据解释为不同的字节顺序。
  • arr.byteswap() 更改基础数据的字节顺序,保持dtype 解释不变

目前更改numpy 数组字节顺序通常有三种情况:

  • 当数据与dtype 字节序列不匹配,需更改dtype 匹配数据
  • 当数据与dtype 字节序列不匹配,需要更改数据得以匹配dtype
  • 当数据与dtype 字节序匹配,期望交换数据与dtype

总结

本期,对numpy模块中对于数组内部存储,字节序列两种规则大端模式和小端模式进行学习。

大小端规则,常见于电脑内部系统存储方式,通常IBM、Sun系统是以大端模式存储,X86、DEC CPU系统是采用小端模式。

以上是本期内容,欢迎大佬们点赞评论,下期见~