我有一个2d阵列,每个阵列都有不同的物种。我在数组上选择一个随机元素,我想要计算紧邻该元素的八个方块中每个物种的数量。
但是我希望数组在边缘处包裹,所以如果我在顶行选择一个元素,则底行将被计为“相邻”。如何在迭代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
答案 0 :(得分:1)
您可以使用j%8
换行,从而为您提供0到7之间的数字。
答案 1 :(得分:1)
至于包装,我建议使用从-1到+1的相对索引,然后使用模运算符(%
)计算实际索引。
至于确保你不计算原始元素(x,y),你做的很好(我可能会使用反转的连续并继续,但没关系)。
我不太了解你对i, j, k
索引的使用,所以我只假设i
是物种的索引,j, k
是2d地图的索引hab
{1}}我将其更改为x_rel
,y_rel
和x_idx
以及y_idx
,以使其更具可读性。如果我弄错了,请更改密码或告诉我。
我也冒昧地做了一些小修理:
N
常数range
更改为xrange
(xrange更快,占用内存更少等)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
答案 2 :(得分: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]],
]