【问题标题】:Numpy -- Split 2D array into sub-arrays based on indicesNumpy - 根据索引将二维数组拆分为子数组
【发布时间】:2013-12-27 03:27:02
【问题描述】:

我有一个数组,我想根据明显且不重叠的矩形将其拆分为子数组:

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

np.split 和对应的组件 vsplithsplitdsplit 仅沿指定的轴和索引数组工作。

A question on binning 回答了类似的问题,但在我的情况下,这些垃圾箱的间距不规则且大小不一。

就我而言,我试图仅从几个样本中近似出一张图像。因此,我希望以最明显和最直观的方式分割图像。我希望图像本质上被划分为象限。例如,这张图片的右下角属于 36 项,而不是 22 项。

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

【问题讨论】:

  • 嗨,Scott,您能添加一个您想要的输出示例吗?
  • 它被包括在内,但我把它说得更清楚了,并稍微修复了一下。
  • 矩形并不那么明显,因为这种平铺并不是唯一的。右下角可能属于 22 或 36。不过,问题似乎存在隐含的层次结构。以新创建的角的非纳米性为条件,沿行/列递归拆分成两个是否可以实现您的目标?
  • 对。我应该澄清一下。这个数组是小波变换的输出,这意味着它应该被分成更多的正方形。 36 属于更粗略的术语,4、6、20 和 22 属于更精细的术语。我在问题中添加了更多细节。

标签: python arrays numpy split


【解决方案1】:
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]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多