将generic_filter限制为特定轴

时间:2017-08-28 18:23:45

标签: python numpy image-processing scipy vectorization

假设我有一个numpy形状的数组(n,m)。如何在此数组的每3行应用generic filter,以便最终得到一个形状为(n,)的数组?

的问题
scipy.ndimage.generic_filter(input, function, size=3)

是它返回一个形状为(n,m)的数组,因为过滤器正在应用于第二轴的每个元素,而不是每行一次。我可以用

恢复我想要的结果
scipy.ndimage.generic_filter(input, function, size=(3,m))[:,0]

但是这会导致性能下降,因为每个列的工作都是重复的。如何使generic_filter对第一轴而不是第二轴进行操作?

1 个答案:

答案 0 :(得分:0)

您可以使用this SO answer上的sliding_window()功能或使用sklearn.feature_extraction.image.extract_patches_2d从阵列中有效地创建滑动窗口

sliding_window()可让您设定步长 extract_patches窗口的步骤与窗口的大小相同。

鉴于

a = np.ones((6,4))
a = a + np.arange(6)[:, np.newaxis]

>>> a
array([[ 1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.],
       [ 4.,  4.,  4.,  4.],
       [ 5.,  5.,  5.,  5.],
       [ 6.,  6.,  6.,  6.]])

>>> 
>>> z = sliding_window(a, (3,4), ss = (1,4))
>>> for thing in z:
    print(thing, '\n******')

[[ 1.  1.  1.  1.]
 [ 2.  2.  2.  2.]
 [ 3.  3.  3.  3.]] 
******
[[ 2.  2.  2.  2.]
 [ 3.  3.  3.  3.]
 [ 4.  4.  4.  4.]] 
******
[[ 3.  3.  3.  3.]
 [ 4.  4.  4.  4.]
 [ 5.  5.  5.  5.]] 
******
[[ 4.  4.  4.  4.]
 [ 5.  5.  5.  5.]
 [ 6.  6.  6.  6.]] 
******

您仍需要循环窗口以应用函数

>>> def func(a):
    return a.sum()

>>> [func(a) for a in z]
[24.0, 36.0, 48.0, 60.0]
>>>

或者可能,取决于功能

>>> np.sum(z, (1,2))
array([ 24.,  36.,  48.,  60.])
>>> 

除非我完全误解了你的问题,否则

我希望这与你想要达到的目标接近。

另一种选择可能是将您的数组重塑为(n//3, 3*m),然后使用generic_filter1d