如果我用它来查看 2 `np.uint8` 为 1 `np.uint16`,我如何理解 `numpy.narray.view` 结果的顺序?

How can I understand the order of the result of `numpy.narray.view` if I use it to view 2 `np.uint8` as 1 `np.uint16`?

假设我有一个数组 a,其中包含两个数据类型 np.uint8 的元素。我想查看这个数组,就好像它的内容是 np.uint16 数据类型一样。所以我使用 numpy.narray.view 方法:

import numpy as np

a = np.array([1, 2], dtype=np.uint8)
print(a.view(np.uint16))

这导致 [513]。但是,我预计这是:

a is [               1,               2 ]
       0 0 0 0 0 0 0 1, 0 0 0 0 0 0 1 0

                    _______________ _______________
So a.view should be 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 (binary 1 then 2)
                                                258

为什么是相反的?

                         _______________ _______________
a.view really results in 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 (binary 2 then 1)
                                                     513

为什么顺序是这样?

感谢@WarrenWeckesser 和@hpaulj 的评论,我明白了:

numpy.uint16中可以解释为两个numpy.uint8的两部分不一定在内存中"consecutively"。字节如何存储在内存中取决于平台的字节顺序。对我来说,"consecutive" 存储字节似乎很直观,但仅适用于大端平台。

有关字节顺序的更多信息,请参阅维基百科文章:https://en.wikipedia.org/wiki/Endianness

我平台的字节顺序是小端。所以如果我调用 a.view(np.uint16) 这等同于 a.view("<u2")numpy.uint16 的最后一部分导致第一个 numpy.uint8,反之则产生 513。如果我调用 a.view(">u2"),我会得到两个 numpy.uint8 的连续顺序,因此结果是 258

>代表big-endian,<代表little-endian,u2表示16位无符号整数。

要进一步阅读,SciPy.org...

上有两篇适合的文章