2014-10-30 62 views
3

我想在numpy中加或減兩個數組,但結果必須爲每個元素定界。如果我限制典型值(即uint8),任何額外的和會產生一個溢出(即再次從零開始)和任何下溢的差(即再次從255開始)。這不是我想要的,即我想停在0/255(在我的例子中)。numpy數組的有界和或差數

有沒有辦法做到這一點,而不訪問每個元素?

預先感謝您。

+0

[這是一個類似的帖子](http://stackoverflow.com/q/19580102/832621),可以幫助你... – 2014-10-30 09:16:10

回答

2

你可以使用一個掩模

實施例:除了不超過255:

import numpy as np 
# create exaple data where sum exceeds 255 
a = np.arange(118,130,dtype = np.uint8) 
b = a.copy() 
res = np.add(a,b, dtype = np.uint16); 
mask = res > 255 
res[mask] = 255 
res = np.uint8(res) 

結果是:

>>> print a 
array([118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129], dtype=uint8) 
>>> print b 
array([118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129], dtype=uint8) 
>>> print mask 
array([False, False, False, False, False, False, False, False, False, False, True, True], dtype=bool) 
>>> print res 
array([236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 255, 255], dtype=uint8) 

掩模只能正確作爲numpy的陣列。否則,高級索引會返回一個視圖,而不是一個副本,請參閱SciPy/NumPy documentation.

+0

這是否也工作,如果np.type是uint8?我檢查了它,答案是否定的。所以我需要在添加之前將數組轉換爲更大的類型(如何?)? – 2014-10-30 09:27:00

+0

看我的編輯。現在,'a','b'和結果'res'是np.uint8 – jkalden 2014-10-30 10:02:26

+0

好的,非常感謝,它的工作原理。 – 2014-10-30 10:48:58

0

你可以用OpenCV的工作,如果你有CV2庫:

import cv2 
import numpy as np 

x=np.uint8([250]) 
y=np.uint8([10]) 
print cv2.add(x,y) #250+ 10 =260=>255 

答:

[[255]]