簡體   English   中英

numpy數組上的可分離過濾器

[英]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個維度上做一些減少。 summean是典型的,例如

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.

(或使用hstackvstack達到相同的效果)。

但是一件很好的事(或許不是那么好)有關跨入的辦法是,它不涉及復制的任何數據a -它只是一個視圖。

至於將作業分成幾部分,我可以想象使用C片(在前2個維度上),例如

 C[0:100,0:100,:,:].sum(axis=(2,3))

暫無
暫無

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

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