0

それぞれに異なる種の2D配列があります。配列からランダムな要素を選び、その要素のすぐ隣にある8つの正方形にそれぞれの種がいくつあるかを数えたいと思います。

ただし、配列を端で折り返したいので、上の行の要素を選択すると、下の行は「隣接」としてカウントされます。j in range (x-1,x+1)jとyを繰り返し処理しながら、これを行うにはどうすればよいですか?

また、線よりも隣接する正方形を見ながら最初に選んだ要素を省略するよりエレガントな方法はありif (j!=x or k!=yますか?

numspec = [0] * len(allspec)
for i in range (0,len(allspec)):
    #count up how many of species i there is in the immediate area
    for j in range(x-1,x+1):
        for k in range(y-1,y+1):
            if (j!=x or k!=y):
                numspec[hab[i][j]] = numspec[hab[i][j]]+1
4

3 に答える 3

2

これを使用j%8してラップすると、0から7までの数値が得られます。

于 2012-12-06T12:55:19.867 に答える
1

ラッピングに関しては、-1から+1までの相対インデックスを使用してから、モジュロ演算子(%)を使用して実際のインデックスを計算することをお勧めします。

元の要素(x、y)を数えないようにすることに関しては、問題なく実行しています(おそらく、逆の条件を使用して続行しますが、問題ではありません)。

i, j, kインデックスの使い方がよくわからないので、それiが種のインデックスであり、私が変更しj, kた2Dマップへのインデックスであり、読みやすくするためのものだと思います。間違えた場合は、コードを変更するか、お知らせください。habx_rely_relx_idxy_idx

私はまた、いくつかのマイナーな修正を行う自由を取りました:

  • N種の数を表す定数を導入
  • に変更されrangeましたxrange(xrangeの方が高速、メモリの使用量が少ないなど)
  • 範囲(またはxrange)に0を指定する必要はありません
  • X = X + 1値を増やす代わりに、次の+=ようなインクリメント演算子を使用しました。X += 1

結果のコードは次のとおりです。

N = len(allspec)
numspec = [0] * N
for i in xrange(N):
    for x_rel in xrange(-1, +1):
        for y_rel in xrange(-1, +1):
            x_idx = (x + xrel) % N
            y_idx = (y + yrel) % N
            if x_idx != x or y_idx != y:
                numspec[hab[x_idx][y_idx]] += 1
于 2012-12-06T13:16:55.097 に答える
0

隣接する要素のリストを作成して、そこから移動できます。たとえば、2Dリストが呼び出されmy_array、すぐ周囲のブロックを調べたい場合は、次のmy_array[x][y]ようにすることができます。

xmax = len(my_array)
ymax = len(my_array[0])  #assuming it's a square...

x_vals = [i%xmax for i in [x-1,x,x+1]]
y_vals = [blah]

surrounding_blocks = [ 
     my_array[x_vals[0]][y_vals[0]],
     my_array[x_vals[0]][y_vals[1]],
     my_array[x_vals[0]][y_vals[2]],
     my_array[x_vals[2]][y_vals[0]],
     my_array[x_vals[2]][y_vals[1]],
     my_array[x_vals[2]][y_vals[2]],
     my_array[x_vals[1]][y_vals[0]],
     my_array[x_vals[1]][y_vals[2]],
        ] 
于 2012-12-06T12:57:08.247 に答える