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

5

我有一个数组,想要将其分割成基于明显且不重叠矩形的子数组:

>>> 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]])

这些位置可以轻松地使用 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 ]]))
     ...
< p > np.split 和相应的组件vsplit, hsplitdsplit 只能沿着指定的轴和索引数组进行操作。

一个有关重采样的问题回答了一个类似的问题,但在我的情况下,箱子的间距不是规则的,大小也不相同。

在我的情况下,我尝试仅使用少量样本近似图像。因此,我希望将图像分割成最明显和直观的方式。我希望将图像基本上分成四个象限。例如,这张图片的右下角将属于第36项而不是第22项。

是否有简单的方法来做到这一点,还是我必须自己解析它们?


嗨,Scott,请您添加一个您所期望的输出示例吗? - Jesuisme
它已经被包含了,但我让它更加清晰并稍作修正。 - Scott
这些矩形并不是很明显,因为这种铺砖方式并不唯一。右下角可能属于22或36。然而,问题似乎存在一种隐含的层次结构。如果按行/列进行递归分割,并根据新创建的拐角是否非零来进行条件判断,能够实现你的目标吗? - Eelco Hoogendoorn
好的,我应该澄清一下。这个数组是小波变换的输出,意味着它应该被分成更多的正方形。36属于更粗糙的项,而4、6、20和22属于更细的项。我在问题中添加了更多细节。 - Scott
1个回答

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]

这会产生所需的数据集拆分,但它基于关于数据布局的几个假设,你没有指定这些假设,也可能不成立。但可以修改这个基本思想以适应各种情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接