我有一个函数my_fun
,它在图像的kxk
窗口上工作,并返回标量。
我想覆盖图像像素,并为每个像素提取一个大小为kxk
的窗口。k
参数是奇数。
我正在寻找一个迭代器,类似于Matlab nlfilter
。
什么是快速的,也与最小的内存开销?
它应该像这样:
import numpy as np
my_array = np.arange(25).reshape((5,5))
win_radius = (1, 1) # k = 3
for i in range(my_array.shape[0]):
for j in range(my_array.shape[1]):
win_rows = max(0, i - win_radius[0]), min(my_array.shape[0], i + win_radius[0] + 1)
win_cols = max(0, j - win_radius[1]), min(my_array.shape[1], j + win_radius[1] + 1)
my_win = my_array[win_rows[0]:win_rows[1], win_cols[0]:win_cols[1]]
print(my_win)
输出为:
[[0 1]
[5 6]]
[[0 1 2]
[5 6 7]]
[[1 2 3]
[6 7 8]]
[[2 3 4]
[7 8 9]]
[[3 4]
[8 9]]
[[ 0 1]
[ 5 6]
[10 11]]
[[ 0 1 2]
[ 5 6 7]
[10 11 12]]
[[ 1 2 3]
[ 6 7 8]
[11 12 13]]
[[ 2 3 4]
[ 7 8 9]
[12 13 14]]
[[ 3 4]
[ 8 9]
[13 14]]
...
[[17 18 19]
[22 23 24]]
[[18 19]
[23 24]]
1条答案
按热度按时间55ooxyrt1#
可以使用
np.lib.stride_tricks.sliding_window_view()
:例如对于
2 x 3
的滑动窗口。