<p>根据代码的最终目标,您可能会发现<a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.label.html" rel="nofollow noreferrer">^{<cd1>}</a>及其相关项很有用。在</p>
<p>例如</p>
<pre><code>In [44]: from scipy.ndimage import label
In [45]: x
Out[45]:
array([[ True, True, False, False, True],
[False, False, False, True, True],
[False, True, False, True, False],
[ True, True, False, False, False]], dtype=bool)
In [46]: x.astype(int) # More concise, easier to read
Out[46]:
array([[1, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0]])
</code></pre>
<p><code>label</code>返回两个值。第一个是与输入数组大小相同的数组。输入中每个不同连接的组件都分配了一个整数值,从1开始。背景为0。第二个返回值是找到的组件数。在</p>
^{pr2}$
<p>在下面,<code>where(labeled_array = i)</code>返回一个包含两个数组的元组。这些数组分别是所连接组件的行和列索引:</p>
<pre><code>In [50]: for i in range(1, nlabels+1):
...: print(where(labeled_arr == i))
...:
(array([0, 0]), array([0, 1]))
(array([0, 1, 1, 2]), array([4, 3, 4, 3]))
(array([2, 3, 3]), array([1, 0, 1]))
</code></pre>
<p>您可以将它们压缩在一起以将它们转换为(行、列)对的列表:</p>
<pre><code>In [52]: for i in range(1, nlabels+1):
...: print(list(zip(*where(labeled_arr == i))))
...:
[(0, 0), (0, 1)]
[(0, 4), (1, 3), (1, 4), (2, 3)]
[(2, 1), (3, 0), (3, 1)]
</code></pre>