【发布时间】: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 和对应的组件 vsplit、hsplit 和 dsplit 仅沿指定的轴和索引数组工作。
A question on binning 回答了类似的问题,但在我的情况下,这些垃圾箱的间距不规则且大小不一。
就我而言,我试图仅从几个样本中近似出一张图像。因此,我希望以最明显和最直观的方式分割图像。我希望图像本质上被划分为象限。例如,这张图片的右下角属于 36 项,而不是 22 项。
有没有简单的方法可以做到这一点,还是我必须自己解析?
【问题讨论】:
-
嗨,Scott,您能添加一个您想要的输出示例吗?
-
它被包括在内,但我把它说得更清楚了,并稍微修复了一下。
-
矩形并不那么明显,因为这种平铺并不是唯一的。右下角可能属于 22 或 36。不过,问题似乎存在隐含的层次结构。以新创建的角的非纳米性为条件,沿行/列递归拆分成两个是否可以实现您的目标?
-
对。我应该澄清一下。这个数组是小波变换的输出,这意味着它应该被分成更多的正方形。 36 属于更粗略的术语,4、6、20 和 22 属于更精细的术语。我在问题中添加了更多细节。