[英]Difference between numpy.uint8 and numpy.int8 in openCV?
[英]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)
有沒有辦法控制結果數組的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進行轉換的大型數組而言,它的空間效率更高,但成本更高。
如何快速地進行這種轉換?
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.