相对于原点累积滑动窗口

2024-04-20 12:54:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个形状为(3,3)的数组A,它可以被认为是形状为(5,)的未知数组的滑动窗口视图。我想用(5,)形状计算数组窗口化的逆运算。这个函数的伴随运算是求和运算。我的意思是,我想用数组中的相关位置(5,)累积每个对应窗口中的值。当然,这个逆函数的预期输出和输入A是不相关的,只是普通数组。我有两个例子,希望能更好地解释这一点

A = np.array([[0, 0, 1],
              [0, 0, 1],
              [0, 0, 1]], dtype=np.float32)

我预计这一产出:

np.array([0, 0, 1, 1, 1])

另一个例子是:

A = np.array([[1, 2, 3],
              [2, 3, 4],
              [3, 4, 5]], dtype=np.float32)

我预计这一产出:

np.array([1, 2+2, 3+3+3, 4+4, 5]) = np.array([1, 4, 9, 8, 5])

我的解决方案非常慢(结果存储在out

out = np.zeros(5, dtype=np.float32)
windows = np.lib.stride_tricks.as_strided(out, shape=(3,3), strides=(4,4))
for i in np.ndindex(windows.shape):
  windows[i] += A[i]

以一种跨越式的视角写作让人感觉有点不舒服,我相信有更好的解决方案

有没有办法不用for循环,以矢量化的方式编写?(这也适用于多维)

编辑

就更高维度的泛化而言,我有这样的情况:窗口是从图像(2d数组)中获取的,而不是像上面的示例那样的1d数组。对于2d情况,A例如可以是大小为3的窗口。这意味着从具有(4,4)形状的图像(输出),窗口A将具有(2,2,3,3)形状

A = np.array([[[[0, 0, 0],
                [0, 1, 0],
                [0, 0, 0]],

               [[0, 0, 0],
                [1, 0, 0],
                [0, 0, 0]]],


              [[[0, 1, 0],
                [0, 0, 0],
                [0, 0, 0]],

               [[1, 0, 0],
                [0, 0, 0],
                [0, 0, 0]]]], dtype=np.float32)

使用Pablo给出的解决方案,我得到以下错误

value array of shape (2,2,3,3)  could not be broadcast to indexing result of shape (2,2)

使用稍微修改过的my stride解决方案:

def inverse_sliding_windows(A, window_sz, image_sz):
  out = np.zeros(image_sz, dtype=np.float32)
  windows = np.lib.stride_tricks.sliding_window_view(out, window_sz, writeable=True)
  for i in np.ndindex(windows.shape):
    windows[i] += A[i]

window_sz = (3,3)
image_sz = (4,4)
inverse_sliding_windows(A, window_sz, image_sz)

输出:

array([[0., 0., 0., 0.],
       [0., 4., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]], dtype=float32)

为了澄清,窗口大小和输出形状是预先知道的,请参见inverse_sliding_windows


Tags: imagewindowsnp数组解决方案outwindowarray
1条回答
网友
1楼 · 发布于 2024-04-20 12:54:53

实际上,我正在从php过渡到spring boot。Spring boot实际上自动将java对象编码为json。如果你开发的后端有一些轻量级的框架,带有路由和模型控制器结构,你可以很容易地将其转换为spring boost

相关问题 更多 >