将稀疏二维数组或表分解为多个子数组或子表

问题描述 投票:0回答:1

我想找到一种方法来“套索”稀疏表中的一堆连续/接触的值,并输出一组新表。如果任何值“接触”,它们应该一起成为子数组的一部分。

例如:如果我有以下稀疏表/数组:

[[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
论点就是我所追求的。如果我有时间,我会用答案更新我的问题。

python pandas numpy scipy
1个回答
0
投票

一个可能的解决方案:

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]])]
© www.soinside.com 2019 - 2024. All rights reserved.