почему numpy вид назад? - PullRequest
4 голосов
/ 23 марта 2020
import numpy as np
data = np.array([0, 0, 0, 0, 0, 0, 0, 1], dtype=np.uint8)
data.view(np.uint64)

Я ожидаю, что двоичный файл будет выглядеть следующим образом:

0b0000000000000000000000000000000000000000000000000000000000000001

, но вместо этого 8-битные группы будут инвертированы.

np.array([72057594037927936], dtype=np.uint64)

, что:

0b0000000100000000000000000000000000000000000000000000000000000000

Почему это? Делается ли вычисление, которое обращает это вспять, или это просто макет?

1 Ответ

1 голос
/ 23 апреля 2020

Ваши предположения верны относительно порядка следования двоичных данных в вашем массиве. Вместо просмотра как uint64, вы можете просматривать как 8 байтов (V8 dtype):

import numpy as np
np.array([0, 0, 0, 0, 0, 0, 0, 1], dtype=np.uint8).view('V8')[0]
# void(b'\x00\x00\x00\x00\x00\x00\x00\x01')

Однако ваш ЦП использует little endian упорядочение байтов для представления целых чисел. Это означает, что при просмотре байтов как uint64 вы получите действительно большое число.

Вы можете проверить это следующим образом, используя пакет struct :

import struct
import sys

print(sys.bybteorder)
# 'little'

# view these bytes as uint64 with little endian gives a big number
struct.unpack('<Q', b'\x00\x00\x00\x00\x00\x00\x00\x01')[0]
# 72057594037927936

# view these bytes as uint64 with big endian gives 1
struct.unpack('>Q', b'\x00\x00\x00\x00\x00\x00\x00\x01')[0]
# 1

# view these bytes as uint64 with native endian gives a big number with your CPU
struct.unpack('=Q', b'\x00\x00\x00\x00\x00\x00\x00\x01')[0]
# 72057594037927936
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...