我有一个数组,我想根据明显和不重叠的矩形分成子数组:
>>> 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
以及相应的组件vsplit
,hsplit
和dsplit
,仅适用于指定的轴和索引数组。
A question on binning回答了一个类似的问题,但在我的情况下,这些垃圾箱不是规则间隔而且大小不同。
在我的情况下,我试图仅从几个样本中逼近图像。因此,我希望以最明显和最直观的方式分割图像。我希望图像基本上分成象限。例如,此图像的右下角属于36个术语而不是22个术语。
有没有一种简单的方法可以做到这一点,还是我必须自己解析它?
答案 0 :(得分: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]
这会为此数据集生成所需的拆分;但它取决于对数据布局的几个假设,这些假设是您所指定的,而且可能不成立。但是人们可以修改一般的想法以适应各种情况。