Sco*_*ott 5 python arrays split numpy
我有一个数组,我想基于明显和非重叠的矩形拆分成子数组:
>>> 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]])
Run Code Online (Sandbox Code Playgroud)
这些位置很容易找到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 ]]))
...
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)
这会产生该数据集所需的分割;但这取决于有关数据布局的几个假设,您尚未指定这些假设,并且这些假设可能不成立。但人们可以修改总体思路以适应各种情况。