隣接するnumpy領域のセルをカウントします

cf2

私は次の問題を解決しようとしています。1からnまでの領域にラベル付けされたnumpy配列があります。これが配列だとしましょう:

x = np.array([[1, 1, 1, 4], [1, 1, 2, 4], [1, 2, 2, 4], [5, 5, 3, 4]], np.int32)

array([[1, 1, 1, 4],
       [1, 1, 2, 4],
       [1, 2, 2, 4],
       [5, 5, 3, 4]])

領域は、一意の値を持つnumpy配列内の結合されたセルです。したがって、この例では、xには5つの領域があります。5つのセルで構成される領域1、3つのセルで構成される領域2など。ここで、次のコード行を使用して、各領域の隣接する領域を決定します。

n = x.max()
tmp = np.zeros((n+1, n+1), bool)

# check the vertical adjacency
a, b = x[:-1, :], x[1:, :]
tmp[a[a!=b], b[a!=b]] = True

# check the horizontal adjacency
a, b = x[:, :-1], x[:, 1:]
tmp[a[a!=b], b[a!=b]] = True

# register adjacency in both directions (up, down) and (left,right)
result = (tmp | tmp.T)

result = result.astype(int)
np.column_stack(np.nonzero(result))
resultlist = [np.flatnonzero(row) for row in result[1:]]

これにより、各リージョンとその隣接リージョンのリストが表示されます。

[array([2, 4, 5], dtype=int64),
 array([1, 3, 4, 5], dtype=int64),
 array([2, 4, 5], dtype=int64),
 array([1, 2, 3], dtype=int64),
 array([1, 2, 3], dtype=int64)]

これは本当にうまくいきます。ただし、隣接する各領域のセル数をカウントして、この出力を返したいと思います。したがって、リージョン2の場合、この例では、合計7つの隣接するリージョン(3つの1、2つの4、1つの3、および1つの5)を意味します。したがって:

  • 2は43%が1で囲まれています
  • 2は14%x5で囲まれています
  • 2は14%が3に囲まれています
  • 2は29%が4に囲まれています

上記のコードを調整して、隣接する各領域のセルの量を含めるにはどうすればよいですか?みんなありがとう!

Eelco Hoogendoorn

これは、numpy_indexedパッケージを使用したベクトル化されたソリューションです(注;領域ではベクトル化されていませんが、ピクセルではベクトル化されています。これは、n_pixels >> n_regionsと仮定して行うと便利です):

neighbors = np.concatenate([x[:, :-1].flatten(), x[:, +1:].flatten(), x[+1:, :].flatten(), x[:-1, :].flatten()])
centers   = np.concatenate([x[:, +1:].flatten(), x[:, :-1].flatten(), x[:-1, :].flatten(), x[+1:, :].flatten()])
valid = neighbors != centers

import numpy_indexed as npi
regions, neighbors_per_regions = npi.group_by(centers[valid], neighbors[valid])
for region, neighbors_per_region in zip(regions, neighbors_per_regions):
    print(region)
    unique_neighbors, neighbor_counts = npi.count(neighbors_per_region)
    print(unique_neighbors, neighbor_counts / neighbor_counts.sum() * 100)

または、ピクセルと領域の両方で完全にベクトル化されたソリューションの場合:

(neighbors, centers), counts  = npi.count((neighbors[valid], centers[valid]))
region_group = group_by(centers)
regions, neighbors_per_region = region_group.sum(counts)
fractions = counts / neighbors_per_region[region_group.inverse]
for q in zip(centers, neighbors, fractions): print(q)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

try-exceptを使用してnumpy配列内の隣接セルをカウントする方法は?

分類Dev

Rの行列内の隣接するセルの外側のエッジをカウントします

分類Dev

範囲内の2つの隣接するセル値の出現をカウントします(Excel)

分類Dev

隣接するセルをカウントするrownumber()関数

分類Dev

隣接する領域に対応する領域でランダムにポイントを選択し、無限の再帰を回避します

分類Dev

隣接するセルに数値がある場合にのみ、個別のセルの数をカウントします

分類Dev

ベクトル内の隣接する要素を繰り返しカウントします-matlab

分類Dev

R隣接するベクトル要素の符号スイッチの数をカウントします

分類Dev

列内の空でない値をカウントしますが、隣接する列に基づいてカウンターをリセットします

分類Dev

MYSQLは、各行の隣接エントリの数をカウントします

分類Dev

合計がゼロの場合、隣接するすべてのサブ配列をカウントします

分類Dev

行内の隣接する数値のペアを抽出してカウントします

分類Dev

列内の隣接する繰り返しの累積カウントを作成します

分類Dev

隣接する部分文字列をグループ化し、カウントを見つけます

分類Dev

ハルコン-別の領域と交差する領域を拡張します

分類Dev

2D配列内の隣接するセルをカウントすることになっているクラスは、C#では正しくカウントされません

分類Dev

amMapで選択した領域の色を、隣接する領域とは異なる色に変更します。

分類Dev

CLinuxマウントの空き領域を確認します

分類Dev

セルが持つ隣接セルの数をカウントするこのGameof Lifeメソッドを単純化する方法は?

分類Dev

opencvの深度カラーに基づいて接続領域をセグメント化する方法

分類Dev

DFS アルゴリズムを使用して、マトリックス内の隣接する数値の最大領域を見つける

分類Dev

隣接するセルとその隣接セルをPythonでクラスターに集約します

分類Dev

隣接する重複を無視してリスト内の要素をカウントする

分類Dev

Delphiを使用してウィンドウの非クライアント領域でカスタムカーソルを使用する方法

分類Dev

VBAを介して選択(すべての領域)の行をカウントする

分類Dev

遅延してクライアント領域でマウスカーソルを非表示にしますか?

分類Dev

未割り当て領域を単一の未割り当て領域としてマージしてウィンドウをインストールする

分類Dev

Cの隣接リストグラフ表現で発信リンクをカウントします

分類Dev

セルを連続してカウントするが、Excelで隣接するセルを1回だけカウントするにはどうすればよいですか?

Related 関連記事

  1. 1

    try-exceptを使用してnumpy配列内の隣接セルをカウントする方法は?

  2. 2

    Rの行列内の隣接するセルの外側のエッジをカウントします

  3. 3

    範囲内の2つの隣接するセル値の出現をカウントします(Excel)

  4. 4

    隣接するセルをカウントするrownumber()関数

  5. 5

    隣接する領域に対応する領域でランダムにポイントを選択し、無限の再帰を回避します

  6. 6

    隣接するセルに数値がある場合にのみ、個別のセルの数をカウントします

  7. 7

    ベクトル内の隣接する要素を繰り返しカウントします-matlab

  8. 8

    R隣接するベクトル要素の符号スイッチの数をカウントします

  9. 9

    列内の空でない値をカウントしますが、隣接する列に基づいてカウンターをリセットします

  10. 10

    MYSQLは、各行の隣接エントリの数をカウントします

  11. 11

    合計がゼロの場合、隣接するすべてのサブ配列をカウントします

  12. 12

    行内の隣接する数値のペアを抽出してカウントします

  13. 13

    列内の隣接する繰り返しの累積カウントを作成します

  14. 14

    隣接する部分文字列をグループ化し、カウントを見つけます

  15. 15

    ハルコン-別の領域と交差する領域を拡張します

  16. 16

    2D配列内の隣接するセルをカウントすることになっているクラスは、C#では正しくカウントされません

  17. 17

    amMapで選択した領域の色を、隣接する領域とは異なる色に変更します。

  18. 18

    CLinuxマウントの空き領域を確認します

  19. 19

    セルが持つ隣接セルの数をカウントするこのGameof Lifeメソッドを単純化する方法は?

  20. 20

    opencvの深度カラーに基づいて接続領域をセグメント化する方法

  21. 21

    DFS アルゴリズムを使用して、マトリックス内の隣接する数値の最大領域を見つける

  22. 22

    隣接するセルとその隣接セルをPythonでクラスターに集約します

  23. 23

    隣接する重複を無視してリスト内の要素をカウントする

  24. 24

    Delphiを使用してウィンドウの非クライアント領域でカスタムカーソルを使用する方法

  25. 25

    VBAを介して選択(すべての領域)の行をカウントする

  26. 26

    遅延してクライアント領域でマウスカーソルを非表示にしますか?

  27. 27

    未割り当て領域を単一の未割り当て領域としてマージしてウィンドウをインストールする

  28. 28

    Cの隣接リストグラフ表現で発信リンクをカウントします

  29. 29

    セルを連続してカウントするが、Excelで隣接するセルを1回だけカウントするにはどうすればよいですか?

ホットタグ

アーカイブ