我想找到一种方法来“套索”稀疏表中的一堆连续/接触的值,并输出一组新表。如果任何值“接触”,它们应该一起成为子数组的一部分。
例如:如果我有以下稀疏表/数组:
[[0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0]
[0 0 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0]
[0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 1 0]
[0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0]]
算法应该“找到”子表/子数组。它会像这样识别它们:
[[0 0 0 1 1 0 0 0 2 2 2 2 0 0 0 0 0 0 0]
[0 0 0 1 1 0 0 0 2 2 2 2 2 0 0 3 3 0 0]
[0 0 0 0 0 0 0 0 2 2 2 0 0 0 3 3 3 3 0]
[0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0]]
但最终的输出应该是一系列子数组/子表,如下所示:
[[1 1]
[1 1]]
[[0 1 1 1 1 0]
[0 1 1 1 1 1]
[0 1 1 1 0 0]
[1 0 0 0 0 0]]
[[0 0 1 1 0]
[0 1 1 1 1]
[1 0 0 0 0]]
我怎样才能在Python中做到这一点?我尝试查看 sk-image ,有些事情似乎与我想做的事情相似,但我所看到的似乎都不太合适。
scipy.ndimage.label
与我想要做的非常接近,但它会将极端情况值分解为它们自己的单独数组。所以这不太正确。编辑:啊哈哈,structure
论点就是我所追求的。如果我有时间,我会用答案更新我的问题。
一个可能的解决方案:
labels = measure.label(a, connectivity=2)
regions = measure.regionprops(labels)
list_suba = []
for region in regions:
min_row, min_col, max_row, max_col = region.bbox
subarray = a[min_row:max_row, min_col:max_col]
list_suba.append(subarray)
list_suba
输出:
[array([[1, 1],
[1, 1]]),
array([[0, 1, 1, 1, 1, 0],
[0, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 0, 0],
[1, 0, 0, 0, 0, 0]]),
array([[0, 0, 1, 1, 0],
[0, 1, 1, 1, 1],
[1, 0, 0, 0, 0]])]