如果我用它来查看 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...
上有两篇适合的文章
- 关于如何处理有关数据字节序的问题:https://docs.scipy.org/doc/numpy/user/basics.byteswapping.html
- 以及可以使用或创建的不同数据类型:https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html
假设我有一个数组 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...
上有两篇适合的文章- 关于如何处理有关数据字节序的问题:https://docs.scipy.org/doc/numpy/user/basics.byteswapping.html
- 以及可以使用或创建的不同数据类型:https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html