Если вы хотите переинтерпретировать существующие данные в массиве, который вам нужен numpy.ndarray.view
. В этом основное различие между .astype
и .view
(то есть первый преобразуется в новый тип с сохранением значений , в то время как последний сохраняет ту же память и изменяет ее интерпретацию):
import numpy as np
a = np.array([127,127,127,127,127,127,127,127], dtype=np.uint8)
b = a.view(np.uint64)
print(a)
print(b)
print(b.view(np.uint8))
Это выводит
[127 127 127 127 127 127 127 127]
[9187201950435737471]
[127 127 127 127 127 127 127 127]
Обратите внимание, что 127
имеет начальный ноль в своем двоичном шаблоне, так что это не все, поэтому значение, которое мы получаем в b
отличается от того, что вы ожидаете:
>>> bin(b[0])
'0b111111101111111011111110111111101111111011111110111111101111111'
>>> bin(72057594037927935)
'0b11111111111111111111111111111111111111111111111111111111'
То, что вы предполагаете, представляет собой набор uint7
значений одного бита ...
В любом случае, лучшая часть примерно .view
заключается в том, что будет использоваться точно такой же блок памяти, если вы не скопируете явно:
>>> b.base is a
True
Вывод, конечно, заключается в том, что изменение b
повлияет на a
:
>>> b += 3
>>> a
array([130, 127, 127, 127, 127, 127, 127, 127], dtype=uint8)
Для управления порядком байтов вы должны использовать строковые спецификации dtype , то есть a.view('<u8')
(младший порядок байтов) или a.view('>u8')
(старший порядковый номер). Мы можем использовать это, чтобы воспроизвести ошибочный номер в вашем вопросе:
>>> a2 = np.array([0] + [255] * 7, dtype=np.uint8)
... a2.view('>u8')
array([72057594037927935], dtype=uint64)