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属于较细的术语。我对这个问题补充了更多的细节。