Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy——基于索引将二维数组拆分为子数组_Python_Arrays_Numpy_Split - Fatal编程技术网

Python Numpy——基于索引将二维数组拆分为子数组

Python Numpy——基于索引将二维数组拆分为子数组,python,arrays,numpy,split,Python,Arrays,Numpy,Split,我有一个数组,我想根据明显且不重叠的矩形将其拆分为子数组: >>> 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], [

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

>>> 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_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
和相应的组件
vsplit
hsplit
dsplit
,仅沿指定的轴和索引数组工作

回答了一个类似的问题,但在我的例子中,垃圾箱的间隔不规则,大小也不相同

在我的例子中,我试图仅从几个样本中近似得到一幅图像。因此,我希望以最明显和直观的方式分割图像。我希望图像基本上被分成四个象限。例如,此图像的右下角属于36项,而不是22项

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

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]

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

嗨,斯科特,请您添加一个所需输出的示例好吗?包括在内,但我更清楚地说明了这一点,并对其进行了一些修正。矩形并不那么明显,因为这种平铺方式并不独特。右下角可能属于22或36。不过,这个问题似乎有一个隐含的层次结构。以新创建的角点的非nanness为条件,沿着行/列将其递归拆分为两行是否可以实现您的目标?对。我应该澄清一下。这个数组是小波变换的输出,这意味着它应该被分割成更多的正方形。36属于较粗的术语,4、6、20和22属于较细的术语。我对这个问题补充了更多的细节。