2D配列(numpy.ndarray)の隣接要素をグループ化(クラスタ化)

過去のエントリを見返して,ああこれ凄く単純だったなと思ったのでメモ.

2D配列(numpy.ndarray)の隣接要素をグループ化

import numpy as np
from scipy.ndimage import label
 
a = np.array(
    [
        [12,12,14,14,11,11],
        [10,10,11,11,11,11],
        [10,14,14,10,11,13],
        [12,12,14,13,13,13]
    ]
)
 
values = np.unique(a.ravel())
offset = 0
result = np.zeros_like(a)
for v in values:
  labeled, num_features = label(a == v)
  result += labeled + offset*(labeled > 0)
  offset += num_features
print(result)
[[4 4 7 7 3 3]
 [1 1 3 3 3 3]
 [1 8 8 2 3 6]
 [5 5 8 6 6 6]]

これは,単純にブロードキャストを活用すれば良いだけの話だった.

import numpy as np
from scipy.ndimage import label
 
a = np.array(
    [
        [12,12,14,14,11,11],
        [10,10,11,11,11,11],
        [10,14,14,10,11,13],
        [12,12,14,13,13,13]
    ]
)
 
values = np.unique(a.ravel())
label(a==values[:, None, None])[0].sum(0)
array([[4, 4, 7, 7, 3, 3],
       [1, 1, 3, 3, 3, 3],
       [1, 8, 8, 2, 3, 6],
       [5, 5, 8, 6, 6, 6]])
カテゴリー: 未分類 パーマリンク