У меня есть массив NumPy с одним элементом типа данных uint32
:
>>> import numpy as np
>>> a = np.array([123456789], dtype=np.uint32)
>>> a.dtype.byteorder
'='
Затем я могу интерпретировать данные как прямой порядок байтов:
>>> a.newbyteorder("<").dtype.byteorder
'<'
>>> a.newbyteorder("<")
array([123456789], dtype=uint32)
Или с прямым порядком байтов:
>>> a.newbyteorder(">").dtype.byteorder
'>'
>>> a.newbyteorder(">")
array([365779719], dtype=uint32)
Если последний возвращает другое число 365779719
, поскольку моя платформа является прямым порядком байтов - и, следовательно, была записана в память в порядке обратного порядка байтов.
Что для меня неожиданно, так это то, что следующий добавленный вызов view
, похоже, не зависит от этой интерпретации:
>>> a.newbyteorder("<").view(np.uint8)
array([ 21, 205, 91, 7], dtype=uint8)
>>> a.newbyteorder(">").view(np.uint8)
array([ 21, 205, 91, 7], dtype=uint8)
Я ожидал, что числа будут обратными для порядка байтов с прямым порядком байтов. Почему этого не происходит? Разве view
данные не просматриваются "через" метод newbyteorder
?
Кстати: если я использую byteswap
вместо newbyteorder
и, следовательно, копирую и изменяю байты в памяти, я, очевидно, получаю желаемый результат:
>>> a.byteswap("<").view(np.uint8)
array([ 21, 205, 91, 7], dtype=uint8)
>>> a.byteswap(">").view(np.uint8)
array([ 7, 91, 205, 21], dtype=uint8)
Однако я не хочу копировать данные.
newbyteorder
для массива говорит, что он эквивалентен представлению с другимdtype
(см. Его документацию). - person hpaulj   schedule 21.05.2018view
. - person finefoot   schedule 21.05.2018