簡體   English   中英

從numpy中的其他矩陣生成最大結果矩陣的最有效方法?

[英]Most efficient way to make a max result matrix from other matrices in numpy?

我正在用python做一些圖像信號處理,但對於numpy函數以及如何以最佳方式進行處理,我還是很陌生。

場景:我有四個矩陣g1,g2,g3,g4,它們的形狀均為W,H。

我需要制作一個結果矩陣max_g,其中每個max_g [i,j] = max(gk [i,j])

我正在循環整個圖像並執行以下操作:

max_g = np.zeros(Y_channel.shape)
grads = np.array([np.abs(signal.fftconvolve(Y_channel, g_filter, mode='same')/16.0) for g_filter in g_filters])

for i in range(W):
    for j in range(H):
        max_g[i, j] = np.max([grad[i, j] for grad in grads])

可以使用512x512的圖片,但是對於1280x720這樣的大圖片來說太慢了,有沒有更有效的方法呢? 我的意思是好於0(WxH)

您有一個包含數組的列表,只需stack它們並沿第一個軸取最大值。

設定

np.random.seed(1)
H = 5
W = 5
grads = [np.random.randint(1, 10, (W, H)) for _ in range(4)]

stack + max

np.stack(grads).max(0)

array([[6, 9, 9, 6, 9],
       [9, 8, 9, 8, 8],
       [8, 8, 9, 4, 8],
       [9, 8, 9, 8, 5],
       [7, 9, 9, 9, 7]])

驗證

max_g = np.empty((W, H))
for i in range(W):
    for j in range(H):
        max_g[i, j] = np.max([grad[i, j] for grad in grads])

np.array_equal(max_g, np.stack(grads).max(0))

True

計時

H = 720
W = 1280
grads = [np.random.randint(1, 10, (W, H)) for _ in range(4)]

%timeit np.stack(grads).max(0)
14.8 ms ± 190 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
max_g = np.empty((W, H))
for i in range(W):
   for j in range(H):
       max_g[i, j] = np.max([grad[i, j] for grad in grads])

10.2 s ± 98.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

如您所見,速度大大提高。

暫無
暫無

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

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