1

あるパターンを含む2dバイナリnumpyarraysのサイズが変化します。ただ、このような :numpyの配列内の等しい隣接するセルの数を計算する

import numpy 
a = numpy.zeros((6,6), dtype=numpy.int) 
a[1,2] = a[1,3] = 1 
a[4,4] = a[5,4] = a[4,3] = 1 
ここ

「画像」は、2つのパッチ2と1と3個の接続細胞と1が含まれています。

print a 
array([[0, 0, 0, 0, 0, 0], 
     [0, 0, 1, 1, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 1, 1, 0], 
     [0, 0, 0, 0, 1, 0]]) 


は、私は(右、下の各セルの上、隣人ルークの場合として定義され、その左にある細胞)非ゼロのセルは、別の非ゼロのセルに隣接する頻度を知りたいです擬似複製を含む(その逆も同様)。

内境界の前のapproachは、外側境界を計算するために意図したとおり、間違った値(5)を返します。

numpy.abs(numpy.diff(a, axis=1)).sum() 

そこで上記試験配列のため、正しい合計結果は、(上部パッチは、2つの内部境界は、4つの下部を有する)あろう。

すべてのヒントに感謝します!

EDIT:

  • 間違い:下部は明らか

  • もう少し

+0

"ルークの場合のように定義された隣人が" どういう意味:ここで

編集

は4連結近傍のコードですか? – user2357112

+2

なぜ6は低いのですか? – HYRY

+0

まあ明白な解決策は、インデックスとカウントを二重ループすることです。 –

答えて

3

I所望近傍に説明(同じ値を有する隣接セル)4つの内部エッジを有していますそれが8接続された近隣ならば結果が8だと思います。コードは次のとおりです:

import numpy 
a = numpy.zeros((6,6), dtype=numpy.int) 
a[1,2] = a[1,3] = 1 
a[4,4] = a[5,4] = a[4,3] = 1 

from scipy.ndimage import convolve 

kernel = np.ones((3, 3)) 
kernel[1, 1] = 0 
b = convolve(a, kernel, mode="constant") 
b[a != 0].sum() 

しかし、あなたはルークのケースを言っています。

import numpy as np 
a = np.zeros((6,6), dtype=np.int) 
a[1,2] = a[1,3] = 1 
a[4,4] = a[5,4] = a[4,3] = 1 

from scipy import ndimage 
kernel = ndimage.generate_binary_structure(2, 1) 
kernel[1, 1] = 0 

b = convolve(a, kernel, mode="constant") 
b[a != 0].sum() 
+0

誤解をおかけして申し訳ありません。私はシンプルな4x4の隣接ルームを知りたい(対角線の接続がない、例えば左、右、上、下)。正解は実際に** 6 **ではなく* 8 *(下半分の等値の合計数は4です) – Curlew

+0

私はあなたの例を適応しようとしましたが、 s [2,2] = s [2,2] = 0 [0,0] = s [2,0] = s [2,2] = 0 (a、s、mode = "定数") b [a!= 0] .sum()#は11 '' ' – Curlew

+0

と同じです。センターセルを交換するのを忘れた...ありがとう! – Curlew

関連する問題