Python 沿3D NumPy数组的后2维移动窗口以获得3D块

Python 沿3D NumPy数组的后2维移动窗口以获得3D块,python,arrays,numpy,convolution,Python,Arrays,Numpy,Convolution,我有一个3D NumPy数组a的形状(2,9,9)如下: a = np.array([ [[4, 5, 1, 3, 8, 8, 0, 6, 6], [9, 2, 2, 1, 8, 2, 2, 4, 5], [2, 3, 2, 2, 5, 3, 1, 2, 4], [9, 6, 2, 9, 1, 0, 6, 2, 3], [4, 2, 7, 7, 9, 1, 3, 7, 2], [5, 8, 9, 4,

我有一个3D NumPy数组
a
的形状
(2,9,9)
如下:

a = np.array([
       [[4, 5, 1, 3, 8, 8, 0, 6, 6],
        [9, 2, 2, 1, 8, 2, 2, 4, 5],
        [2, 3, 2, 2, 5, 3, 1, 2, 4],
        [9, 6, 2, 9, 1, 0, 6, 2, 3],
        [4, 2, 7, 7, 9, 1, 3, 7, 2],
        [5, 8, 9, 4, 6, 3, 1, 6, 7],
        [3, 6, 4, 7, 2, 9, 8, 3, 4],
        [0, 4, 1, 2, 3, 7, 3, 7, 5],
        [6, 9, 2, 6, 0, 0, 5, 1, 4]],

       [[4, 2, 0, 1, 6, 7, 1, 0, 8],
        [1, 5, 3, 6, 4, 2, 4, 8, 3],
        [7, 4, 9, 9, 1, 9, 7, 3, 1],
        [3, 6, 1, 2, 5, 4, 1, 3, 0],
        [3, 3, 6, 6, 9, 8, 4, 2, 8],
        [7, 9, 1, 3, 0, 2, 0, 7, 4],
        [6, 7, 9, 3, 0, 2, 1, 9, 2],
        [1, 0, 3, 4, 7, 8, 1, 6, 5],
        [4, 4, 7, 8, 3, 7, 0, 4, 7]]])
我希望使用沿后两个维度移动的窗口(在本例中为
9×9
)获得形状为
2×3×3
的三维块。第一个维度的大小(我称之为“深度”)是任意的。第一个区块的示例如下:

>>> array([
       [[np.nan, np.nan, np.nan],
        [np.nan, 4, 5],
        [np.nan, 9, 2]],

        [[np.nan, np.nan, np.nan],
        [np.nan, 4, 2],
        [np.nan, 1, 5]]])
>>> array([
       [[np.nan, np.nan, np.nan],
        [4, 5, 1],
        [9, 2, 2]],

        [[np.nan, np.nan, np.nan],
        [4, 2, 0],
        [1, 5, 3]]])
第二个是:

>>> array([
       [[np.nan, np.nan, np.nan],
        [np.nan, 4, 5],
        [np.nan, 9, 2]],

        [[np.nan, np.nan, np.nan],
        [np.nan, 4, 2],
        [np.nan, 1, 5]]])
>>> array([
       [[np.nan, np.nan, np.nan],
        [4, 5, 1],
        [9, 2, 2]],

        [[np.nan, np.nan, np.nan],
        [4, 2, 0],
        [1, 5, 3]]])
等等

稍后我需要对这些块应用一个更复杂的函数,而不是简单的平均值之类的,所以我希望使用一个新的数组(我想这是相当内存密集的,有没有其他方法?可能是矢量化的?但这不是必需的)

我尝试将
np.lib.stride\u技巧应用到我的案例中,并尝试使用中的花式索引,但没有达到预期的效果

谢谢

你可以用这个。由于您似乎希望这些窗口视图的最小元素大小为
2
,因此可以将该数组分配给一个更大的
np.nan
数组,并获取结果数组的跨步视图:

from skimage.util import view_as_windows

i,j,k= a.shape
a_exp = np.full((i,j+2,k+2), np.nan)
a_exp[:,1:j+1,1:k+1] = a
或者,您也可以对以下各项执行相同的操作:

并认为:

out = view_as_windows(a_exp, (a.shape[0],3,3))


感谢您提供的
skimage.util.view\u as\u windows
,非常有用!我一直在scikit周围游弋,但从来没有使用过这种方法。不可知的是,如果OP需要,可以使用
view\u as\u窗口(a_exp,(1,3,3))[…,0,:,:]
然后使用
转置(1,2,0,3,4)[0,1]
。更多信息-@Divakar我来看看,谢谢。我只是感兴趣,你认为你能为这个问题找到一个简单的解决方案吗?据我所知,
np.convolve
只对一维数组排序…@janchytry卷积用于求和。你在给那些窗户加总吗?如果你想求和,你可能需要多维卷积-@Divakar不,我没有,这可能是我的不当行为,只是移动窗口与卷积内核。我想稍后应用的函数不能用内核来表达。我发布了一个类似的通用解决方案-您只需要事先使用NaN即可。服务良好@jdehesa!我需要学习更多关于跨步技巧的知识。