Numpy - 根据索引将2D数组拆分为子数组

Sco*_*ott 5 python arrays split numpy

我有一个数组,我想基于明显和非重叠的矩形拆分成子数组:

>>> A = array([[  0.,  nan,   2.,  nan,   4.,  nan,    6,  nan],
               [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
               [ nan,  nan,  nan,  nan,   20,  nan,   22,  nan],
               [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
               [ 32.,  nan,  34.,  nan,  36.,  nan,  nan,  nan],
               [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
               [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
               [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan]])
Run Code Online (Sandbox Code Playgroud)

这些位置很容易找到np.argwhere,而且看起来很自然np.split.我想要的输出是

>>> np.split_2d(A)
    (array([[  0.,  nan ]
            [ nan,  nan ]
            [ nan,  nan ]
            [ nan,  nan ]])
     array([[  2.,  nan ]
            [ nan,  nan ]
            [ nan,  nan ]
            [ nan,  nan ]])
     array([[ 32.,  nan ]
            [ nan,  nan ]
            [ nan,  nan ]
            [ nan,  nan ]])
     array([[ 34.,  nan ]
            [ nan,  nan ]
            [ nan,  nan ]
            [ nan,  nan ]])
     array([[ 4.,  nan ]
            [ nan,  nan ]])
     array([[ 6.,  nan ]
            [ nan,  nan ]])
     array([[ 20,  nan ]
            [ nan,  nan ]])
     array([[ 22,  nan ]
            [ nan,  nan ]])
     array([[ 36.,  nan,  nan,  nan ]
            [ nan,  nan,  nan,  nan ]
            [ nan,  nan,  nan,  nan ]
            [ nan,  nan,  nan,  nan ]]))
     ...
Run Code Online (Sandbox Code Playgroud)

np.split和相应的组件vsplit,hsplit并且dsplit只能沿指定的轴和索引数组工作.

关于分箱的问题回答了类似的问题,但在我的情况下,分档不是规则间隔而且大小不同.

在我的情况下,我试图只从几个样本近似图像.因此,我希望以最明显和最直观的方式分割图像.我希望图像基本上分成象限.例如,此图像的右下角将属于36个术语而不是22个术语.

有没有一种简单的方法可以做到这一点,还是我必须自己解析它?

Eel*_*orn 2

def recurse(A):
    if A.shape[0]>A.shape[1]:   #split longest axis first
        if not np.isnan( A[0,A.shape[1]//2]):
            return [rect for part in np.split(A, 2, axis=1) for rect in recurse(part)]
        if not np.isnan( A[A.shape[0]//2,0]):
            return [rect for part in np.split(A, 2, axis=0) for rect in recurse(part)]
    else:
        if not np.isnan( A[A.shape[0]//2,0]):
            return [rect for part in np.split(A, 2, axis=0) for rect in recurse(part)]
        if not np.isnan( A[0,A.shape[1]//2]):
            return [rect for part in np.split(A, 2, axis=1) for rect in recurse(part)]
    return [A]
Run Code Online (Sandbox Code Playgroud)

这会产生该数据集所需的分割;但这取决于有关数据布局的几个假设,您尚未指定这些假设,并且这些假设可能不成立。但人们可以修改总体思路以适应各种情况。