2016-12-05 95 views
-1

我目前使用numpy來創建一個數組。我想使用矢量化實現來更高效地獲取位置中元素的平均值(i,j)。這些陣列來自文件目錄中的圖像,這些圖像已經全部標準化爲固定大小。爲什麼numpy數組中的最大元素值爲255?

但是,當我嘗試添加圖像數組時,每個元素的總和以a(mod 256)形式返回。我怎樣才能改變元素的最大值?

+0

我會說你的數組是'uint8'類型。使用'numpy.astype'來製作具有所需變量類型的另一個數組。例如'y = x.astype(numpy.uint16)'。 –

回答

1

你的陣列大概是numpy.uint8型的,所以他們迴繞時,擊中256

如果你想獲得更大的效果,請使用astype第一個參數轉換成一個較大的數據類型,例如:

a = np.array(..., dtype=np.uint8) 
b = np.array(..., dtype=np.uint8) 
c = a.astype(np.uint32) + b 

而且你也會得到更大數據類型的結果數組。

Per @Eric,避免暫時的,就可以使用the numpy add function(未法)做加法,傳遞一個dtype所以結果是新類型甚至在輸入不轉換,避免暫時的(至少在Python層面):

c = np.add(a, b, dtype=np.uint32) 
+0

或者更好的是,使用'c = np.add(a,b,dtype = np.uint32)'來避免做一個'a'的臨時拷貝(這比'a'大4倍) – Eric

+0

@Eric:做這樣的事情,但顯然交互式解釋器文檔和[numpy在線文檔](https://docs.scipy.org/doc/numpy/reference/generated/numpy.add.html#numpy.add)騙了我(他們只提到'out'參數,並沒有真正避免溢出問題)。補充說,答案;我首先想要這樣的東西。 – ShadowRanger

+2

我想你必須知道'ufuncs'知道這個參數可用:https://docs.scipy.org/doc/numpy/reference/ufuncs.html – Benjamin

0

你會好起來的第一個創建輸出數組:

average = numpy.zeros(a.shape, numpy.float32) 
image = numpy.zeros_like(average) 

然後遍歷圖像和就地將起來:

for i in images: 
    image[:] = function_that_reads_images_as_uint8(i) 
    average += image 
average /= len(images) 

如果你不需要在除法步驟中的精度,你可能會得到int類型。

+0

或者你可以寫'np.mean(圖像, dtype = np.float32)',它避免了你不應該在numpy中使用的手動循環。 – Eric

+1

@Eric:除非您願意將所有圖像疊加在單個multidim ndarray中(這可能會限制大量圖像的內存),這種方法非常優秀。我的方法只需要兩個相同形狀的數組,一個用於當前正在讀取的圖像,另一個用於結果。我也很驚訝地看到有關循環的說法。循環可以表示您沒有充分利用矢量化的優勢,但絕不是壞事,特別是在涉及使用內存的較大數據或數據集時。 – Benjamin

+0

你的方法需要3個數組,因爲'.type(numpy.float32)'做了一個不必要的拷貝。但是你是對的,我沒有考慮過這個評論中的內存限制,在這種情況下,循環是合理的 – Eric

相關問題