0

我有一个二维数组,每个数组都有不同的物种。我在数组上选择一个随机元素,我想计算每个物种中有多少在紧邻该元素的八个方格中。

但我希望数组在边缘环绕,所以如果我在顶行选择一个元素,底行将被视为“相邻”。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, k2d 地图的索引,并使其更具可读性。如果我弄错了,请更改代码或让我知道。habx_rely_relx_idxy_idx

我还冒昧地做了一些小修复:

  • 引入N代表物种数量的常数
  • 更改rangexrange(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 回答