"Упаковать" np.array из 4 np.uint16 в один np.unit64

Учитывая 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, не важен (при условии, что он не случайный).

Будет ли 281483566710792 ожидаемым результатом?

richardec 17.03.2022 17:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
23
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот решение:

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.

Спасибо! Это похоже именно на то, что я хотел. Что касается порядка, я не возражаю, если он согласован на данной машине.

Filippo Bistaffa 17.03.2022 19:46

Другие вопросы по теме