我有一个形状为(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
实际上,我正在从php过渡到spring boot。Spring boot实际上自动将java对象编码为json。如果你开发的后端有一些轻量级的框架,带有路由和模型控制器结构,你可以很容易地将其转换为spring boost
相关问题 更多 >
编程相关推荐