簡體   English   中英

如何有效地將numpy.int8數組就地轉換為值移位的numpy.uint8數組?

[英]How can I efficiently transform a numpy.int8 array in-place to a value-shifted numpy.uint8 array?

我有一個很大的numpy數組的有符號字節( dtype int8 )。 它包含-128到+127范圍內的全部值。 我想通過向每個元素添加128來有效地將有效轉換為無符號字節數組( dtype uint8 ),例如-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)

有沒有辦法控制結果數組的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進行轉換的大型數組而言,它的空間效率更高,但成本更高。

如何快速地進行這種轉換?

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;

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)

我希望我沒有誤解這些要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM