如何有效地将numpy.int8数组就地转换为值移位的numpy.uint8数组?

时间:2011-10-10 15:51:07

标签: python numpy

我有一个大的numpy数组的有符号字节(dtype int8)。它包含-128到+127范围内的全部值。我想通过向每个元素添加128来有效地将有效转换为无符号字节数组(dtype uint8),例如-128→0,0→128,+ 127→255,等。 / em>所以当然结果仍然适合无符号字节。

在给定正确的数值结果的情况下进行简单的元素添加,但除了源数组之外,还使用两倍的内存(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)

有没有办法控制结果数组的dtypeuint8

将数据原位修改并将数据“转换”为新类型的替代方法,如下所示:

>>> 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进行转换的大型数组来说,它的成本非常高。

如何快速地进行这种转换?

2 个答案:

答案 0 :(得分:14)

import numpy as np
a = np.array([-128, -1, 0, 1, 127], dtype=np.int8)
a = a.view(np.uint8)
a += 128
print a
# -> array([  0, 127, 128, 129, 255], dtype=uint8)

这不会创建任何副本,并且所有操作都是就地的。

编辑:更安全地首先施放到uint ---定义了无符号环绕。 EDIT2 :s / numpy / np / g;

答案 1 :(得分:1)

In [18]: a = numpy.array( [-128, -1, 0, 1, 127 ], dtype=numpy.int8)
In [19]: z = a.view(dtype=numpy.uint8)

In [20]: z += 128

In [21]: z
Out[21]: array([  0, 127, 128, 129, 255], dtype=uint8)

我希望我没有误解这些要求。