Массив numpy конвертирует uin8 lsb в uint16 msb

Я уже спрашивал здесь, но мне просто интересно, не могло ли это быть сделано изначально с помощью numpy, потому что я все равно буду использовать numpy позже с cv2, который читает массивы numpy.

Предыстория: я прочитал 13 фрагментов по 13680 байт с USB-камеры, пока не получил 177840 байт, то есть один необработанный кадр. Я делаю это, добавляя куски:

frame = dev.read(0x81, 0x3570, tout)
frame += dev.read(0x81, 0x3570, tout)
...

Затем список заполняется значениями 0-255, и два из этих значений должны формировать одно значение 0-65535. Итак, мой вопрос заключается в том, как я могу преобразовать этот (я полагаю) список uint8 LSB в массив uint16 numpy с половинным размером списка.

Предположим, у меня есть этот список:

list = [3,103,3,103]

Затем мне нужен массив numpy с:

[26371, 26371]

или есть способ сразу заполнить массив numpy 13 чтениями с моего USB-устройства, чтобы в конце он имел значения uint16 177840/2?


person Paul G.    schedule 28.06.2018    source источник


Ответы (1)


Я, возможно, понял.

list = [3,103,3,103]
nlist = np.asarray(list, dtype='<B')
nlist = nlist.view(np.uint16)
print nlist, type(nlist[0])

выход:

[26371 26371] <type 'numpy.uint16'>
person Paul G.    schedule 28.06.2018
comment
Это работает, но nlist.dtype = np.uint16 — лучший подход, так как данные остаются на месте, меняется только атрибут. Кроме того, не используйте list в качестве имени переменной: это встроенное ключевое слово (как в list(some other collection)), которое будет затенено именем переменной. - person ; 28.06.2018