假设我有一个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
对第一轴而不是第二轴进行操作?
答案 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