У меня большой 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.
Как я могу сделать это преобразование на месте и быстро?