Измените dtype ndarray так, чтобы форма также изменилась - PullRequest
1 голос
/ 21 марта 2020

Мне нужно объединить два байта моего ndarray так, чтобы по горизонтали форма уменьшалась вдвое. Например, я бы хотел go из следующего массива -

>>> np.full((4,4),0xff,dtype='u1')
array([[255, 255, 255, 255],
       [255, 255, 255, 255],
       [255, 255, 255, 255],
       [255, 255, 255, 255]], dtype=uint8)

до -

>>> np.full((4,2),0xffff,dtype='u2')
array([[65535, 65535],
       [65535, 65535],
       [65535, 65535],
       [65535, 65535]], dtype=uint16)

Как я могу это сделать? Я работаю в Python 3.8

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Вы можете использовать приведение вида:

>>> a = np.arange(16,dtype="u1").reshape(4,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]], dtype=uint8)
>>> a.view("<u2") # little endian
array([[ 256,  770],
       [1284, 1798],
       [2312, 2826],
       [3340, 3854]], dtype=uint16)
>>> a.view(">u2") # big endian
array([[   1,  515],
       [1029, 1543],
       [2057, 2571],
       [3085, 3599]], dtype=uint16)
0 голосов
/ 21 марта 2020

Вы можете использовать битовые операции. Я бы определил тип данных для исходного массива как 'u2' или что-то, что будет обрабатывать 16-битное число.

arr = np.full((4, 4), 0xff, dtype='u2')
arr[::2] << 8 | arr[1::2]

Результат:

array([[65535, 65535],
       [65535, 65535],
       [65535, 65535],
       [65535, 65535]], dtype=uint16)
...