在numpy数组上的2d滑动窗口上迭代

eh57zj3b  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(90)

我有一个函数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]]
55ooxyrt

55ooxyrt1#

可以使用np.lib.stride_tricks.sliding_window_view()

arr = np.lib.stride_tricks.sliding_window_view(np.arange(25).reshape((5,5)), (2, 3))

例如对于2 x 3的滑动窗口。

相关问题