I have a large array with numeric bytes ( dtype int8 ). It contains values ββranging from -128 to +127. I would like to efficiently convert an array of unsigned bytes ( dtype uint8 ) by adding 128 to each element, such that -128 β 0, 0 β 128, +127 β 255, etc. Therefore, of course, the results are still saved fits into an unsigned byte.
A simple item-by-element addition that gives the correct numerical result, but creates an array of results using twice as much memory ( dtype int16 ) in addition to the original array, although only low bytes of the result elements are needed.
>>> 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)
Is there a way to control the dtype array of results like uint8 ?
An alternative approach to changing values ββin place and casting data into a new type, for example:
>>> 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)
much more efficient than space, but very expensive time for large arrays with conversion in Python.
How can I do this conversion in place and quickly?