Python numpy阵列上的可分离滤波器

Python numpy阵列上的可分离滤波器,python,arrays,image-processing,numpy,gil,Python,Arrays,Image Processing,Numpy,Gil,假设我有一个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数组
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)
在哪里

写下你的函数,在最后2维上做一些简化<代码>总和或
平均值
将是典型的,例如

B = C.sum(axis=(2,3))
其他的SO问题展示了如何使用
np.lib.stride\u技巧.as\u stride
来构造这样一个数组。但是只有一个3x3的子阵列,它可能会同样快地做一些类似的事情

C = np.zeros((N,M,3,3))
C[:,:,0,0] = a[:-1,:-1]
etc.
(或使用
hstack
vstack
达到相同效果)

但是这种跨越式方法有一个好处(或者可能不是很好),那就是它不需要复制
a
的任何数据,它只是一个视图

至于将作业拆分为多个部分,我可以想象使用
C
(在前两个维度上)的切片,例如


你是说像滚动/移动窗口或过滤器?此链接中的示例用于二维数组上3x3窗口的求和,听起来像其他一些SO问题,大多数使用术语
滑动窗口
(或移动)。尽管大多数关注的是在窗口上迭代,而不是在线程或进程之间拆分任务。
C = np.zeros((N,M,3,3))
C[:,:,0,0] = a[:-1,:-1]
etc.
 C[0:100,0:100,:,:].sum(axis=(2,3))