NumPy基础-字节交换

174 阅读3分钟

字节顺序和ndarrays介绍

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

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

例如,我可能正在使用小端CPU的计算机(如Intel Pentium),但是我已经从由大端计算机编写的文件中加载了一些数据。假设我已经从sun(大端)计算机编写的文件中加载了4个字节。我知道这4个字节代表两个16位整数。在大端计算机上,先存储两个字节的整数,然后在存储最高有效字节(MSB),然后存储最低有效字节(LSB)。因此,字节按存储顺序排列:

1.MSB整数1

2.LSB整数1

3.MSB整数2

4.LSB整数2

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

我们可能需要使用ndarray来访问这些整数,在这种情况下,我们可以在内存周围创建一个数组,并告诉numpy由两个整数,它们是16位的大端数:

请注意dtype上方的数组>i2,>的意思是大端(<是小端)i2表示有符号的字节整数。例如,如果我们的数据表示单个无符号的4字节小端整型,则dtype字符串将为<n4。

回到我们的big_end_arr例子中,在这种情况下,我们的基础数据是大端序(数据字节序),并且我们设置了dtype来匹配(dtype也是大端序)。然而,有时候你需要把这些颠倒过来。

要注意标量目前不包括字节顺序信息,因此从数组中提取标量将返回本机字节顺序的整数。

更改字节顺序

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

1.更改数组dtpe中的字节顺序信息,以使其将基础数据解释为不同的字节顺序,这是arr.newbyteorder()的作用。

2.更改基础数组的字节顺序,保持dtype解释不变,这就是arr.byteswap所做的。

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

1.你的数据和dtype的字节序不匹配,并且你想更改dtype使其与数据匹配。

2.你的数据和dtype的字节序不匹配,并且你想交换数据以使其与dtype匹配。

3.你的数据和dtype的字节序匹配,但是你希望交换数据,并且dtype可以反映这一点。

数据和dtype的字节序不匹配,请更改dtype以匹配数据

我们看一下不匹配的示例:

解决此情况的明显方法是更改dtype,使其具有正确的字节序:

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

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

如果你需要对内存中的数据进行某种排序,则可能需要执行此操作。列如,你可能正在将内存写到需要特定字节顺序的文件中。

现在数组以在内存中更改:

数据和dtype字节顺序匹配,交换数据和dtype

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

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

如果你想学习Python,但是找不到学习路径和资源,欢迎上指尖编程