Учитывая np.array
из 4 np.uint16
input = np.random.randint(10, size=4, dtype=np.uint16)
как я могу «упаковать» их двоичные представления в один np.uint64
?
# Example of C code
# output = input[0] | input[1] << 16 | input[2] << 32 | input[3] << 48
Порядок, в котором упакованы 4 np.uint16
, не важен (при условии, что он не случайный).
Вот решение:
output = np.bitwise_or.reduce(input << (np.arange(len(input)) * 16))
Выход:
>>> output
281483566710792
(Примечание: не используйте имена встроенных функций Python (например, input
) в качестве имен переменных. :)
Вы можете интерпретировать по-новому байт массива с помощью np.view
:
input.view(np.uint64) # 844429225558024 on my x86-64 machine
Это не выполняет никакого копирования или вычисления. Выполняется быстро и в постоянное время. Однако порядок байтов зависит от архитектуры из-за порядок следования байтов. Это прямой порядок байтов на большинстве архитектур, включая x86-64, большинство процессоров ARM и последние процессоры POWER.
Обратите внимание, что input.view(np.uint64).view(np.uint16)
гарантированно даст вам здесь входной массив.
Обратите внимание, что в отношении желаемого порядка байтов вы можете использовать поменять местами байты для массивов Numpy.
Спасибо! Это похоже именно на то, что я хотел. Что касается порядка, я не возражаю, если он согласован на данной машине.
Будет ли
281483566710792
ожидаемым результатом?