我目前使用numpy來創建一個數組。我想使用矢量化實現來更高效地獲取位置中元素的平均值(i,j)。這些陣列來自文件目錄中的圖像,這些圖像已經全部標準化爲固定大小。爲什麼numpy數組中的最大元素值爲255?
但是,當我嘗試添加圖像數組時,每個元素的總和以a(mod 256)形式返回。我怎樣才能改變元素的最大值?
我目前使用numpy來創建一個數組。我想使用矢量化實現來更高效地獲取位置中元素的平均值(i,j)。這些陣列來自文件目錄中的圖像,這些圖像已經全部標準化爲固定大小。爲什麼numpy數組中的最大元素值爲255?
但是,當我嘗試添加圖像數組時,每個元素的總和以a(mod 256)形式返回。我怎樣才能改變元素的最大值?
你的陣列大概是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)
或者更好的是,使用'c = np.add(a,b,dtype = np.uint32)'來避免做一個'a'的臨時拷貝(這比'a'大4倍) – Eric
@Eric:做這樣的事情,但顯然交互式解釋器文檔和[numpy在線文檔](https://docs.scipy.org/doc/numpy/reference/generated/numpy.add.html#numpy.add)騙了我(他們只提到'out'參數,並沒有真正避免溢出問題)。補充說,答案;我首先想要這樣的東西。 – ShadowRanger
我想你必須知道'ufuncs'知道這個參數可用:https://docs.scipy.org/doc/numpy/reference/ufuncs.html – Benjamin
你會好起來的第一個創建輸出數組:
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類型。
或者你可以寫'np.mean(圖像, dtype = np.float32)',它避免了你不應該在numpy中使用的手動循環。 – Eric
@Eric:除非您願意將所有圖像疊加在單個multidim ndarray中(這可能會限制大量圖像的內存),這種方法非常優秀。我的方法只需要兩個相同形狀的數組,一個用於當前正在讀取的圖像,另一個用於結果。我也很驚訝地看到有關循環的說法。循環可以表示您沒有充分利用矢量化的優勢,但絕不是壞事,特別是在涉及使用內存的較大數據或數據集時。 – Benjamin
你的方法需要3個數組,因爲'.type(numpy.float32)'做了一個不必要的拷貝。但是你是對的,我沒有考慮過這個評論中的內存限制,在這種情況下,循環是合理的 – Eric
我會說你的數組是'uint8'類型。使用'numpy.astype'來製作具有所需變量類型的另一個數組。例如'y = x.astype(numpy.uint16)'。 –