Представлять 3 значения как 1 в массиве numpy - PullRequest
1 голос
/ 16 июня 2019

Я пытаюсь преобразовать 3-канальный массив Numpy в один канал NUMPY. Я хочу объединить все 3 значения элемента в 1 число, используя:

x << 16 + y << 8 + z </p>

Мой код, приведенный ниже, делает это, но кажется, что многие цифры равны нулю. Это верно? Или я что-то не так делаю? Должны ли эти последние 2 числа быть нулем или чем-то еще?

ar = np.array((
    ((255,255,255),),
    ((255,20,255),),
    ((0,255,255),),  # this becomes zero, is that correct? 
    ((22,10,12),),   # this becomes zero, is that correct? 
), dtype='uint8')
c1,c2,c3 = cv2.split(ar)
single = np.int32(c1) << 16 + np.int32(c2) << 8 + np.int32(c3)
print(single)
print(ar.shape)

[[1069547520]
[522240]
[0]
[0]]
(4, 1, 3)

1 Ответ

1 голос
/ 16 июня 2019

Добавьте столбец нулей, чтобы сделать массив шириной 4 байта:

ar4 = np.insert(ar, 0, 0, 2)

Затем просто просмотрите его как массив с прямым порядком байтов из 4-байтовых целых чисел:

ar4.view('>u4')

Это дает:

array([[[16777215]],
       [[16717055]],
       [[   65535]],
       [[ 1444364]]], dtype=uint32)

Единственный шаг, который действительно требует времени, это np.insert(), поэтому, если вы можете добавить этот дополнительный столбец при загрузке ваших данных, остальные преобразования в основном бесплатны (т.е. не требуют копирования данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...