[英]Separable filter on numpy array
假設我有一個numpy數組a
,我想創建一個新數組, b
這樣b[i, j]
是函數,比如說:
a[i-1, j-1], a[i-1, j ], a[i-1, j+1],
a[i , j-1], a[i , j ], a[i , j+1],
a[i+1, j-1], a[i+1, j ], a[i+1, j+1]
最快的方法是什么?
由於這是一個可分離的過濾器,有沒有辦法在多個線程中運行它? (不是進程,因為我必須將數據復制回來)
或者正在編寫C代碼以繞過GIL強制執行?
部分解決方案(如假設功能是線性的)也是受歡迎的。
像這樣使用滑動窗口的理想化的numpy
方法是構造一個4D陣列
C.shape = (N,M,3,3)
哪里
C[i,j,:,:] = np.array([a[i-1, j-1], a[i-1, j ], a[i-1, j+1],
a[i , j-1], a[i , j ], a[i , j+1],
a[i+1, j-1], a[i+1, j ], a[i+1, j+1]])
並編寫你的函數在最后2個維度上做一些減少。 sum
或mean
是典型的,例如
B = C.sum(axis=(2,3))
其他SO問題顯示如何使用np.lib.stride_tricks.as_strided
構造這樣的數組。 但是只有3x3的子陣列,做同樣的事情可能同樣快
C = np.zeros((N,M,3,3))
C[:,:,0,0] = a[:-1,:-1]
etc.
(或使用hstack
和vstack
達到相同的效果)。
但是一件很好的事(或許不是那么好)有關跨入的辦法是,它不涉及復制的任何數據a
-它只是一個視圖。
至於將作業分成幾部分,我可以想象使用C
片(在前2個維度上),例如
C[0:100,0:100,:,:].sum(axis=(2,3))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.