[英]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.