Как я могу эффективно преобразовать массив numpy.int8 на месте в массив numpy.uint8 со сдвигом значений?

У меня большой numpy массив байтов со знаком ( dtype int8 ). Он содержит значения в полном диапазоне от -128 до +127. Я хотел бы эффективно преобразовать в массив байтов без знака ( dtype uint8 ), добавив 128 к каждому элементу, так что -128 → 0, 0 → 128, +127 → 255, и т. Д. так что, конечно, результаты все равно помещаются в беззнаковый байт.

Простое поэлементное сложение дает правильный числовой результат, но создает массив результатов, используя вдвое больше памяти ( dtype int16 ) в дополнение к исходному массиву, даже если требуются только младшие байты элементов результата .

>>> import numpy
>>> a = numpy.array( [-128, -1, 0, 1, 127 ], dtype=numpy.int8)
>>> b = a + 128
>>> b
array([  0, 127, 128, 129, 255], dtype=int16)

Есть ли способ сделать так, чтобы dtype результирующего массива было uint8 ?

Альтернативный подход изменения значений на месте и "преобразования" данных к новому типу, например так:

>>> for i in xrange(0, 5):
...     if a[i] < 0:
...         a[i] -= 128
...     elif a[i] >= 0:
...         a[i] += 128
...
>>> a
array([   0,  127, -128, -127,   -1], dtype=int8)
>>> a.view(dtype=numpy.uint8)
array([  0, 127, 128, 129, 255], dtype=uint8)

намного более экономичен, но очень затратен по времени для больших массивов с преобразованием в Python.

Как я могу сделать это преобразование на месте и быстро?

7
задан Rob Smallshire 10 October 2011 в 15:51
поделиться