如何在python中迭代或处理网格或坐标

如何在python中迭代或处理网格或坐标,python,grid,coordinates,Python,Grid,Coordinates,我已经在nxn的网格中创建了一个带有随机数的森林。为了创建森林,我使用了每个网格和一个随机数来种植一棵树。并将种植坐标存储在列表中,x轴为li[],y轴为lj[]。并将坐标放入.dat文件中 在python中,以下是我的代码: from math import * from random import random n = input('Choose grid, N = ') p = 0.5 li = [] lj = [] fid = open('plant.dat','w') for i

我已经在nxn的网格中创建了一个带有随机数的森林。为了创建森林,我使用了每个网格和一个随机数来种植一棵树。并将种植坐标存储在列表中,x轴为
li[]
,y轴为
lj[]
。并将坐标放入.dat文件中

在python中,以下是我的代码:

from math import *
from random import random

n = input('Choose grid, N = ')
p = 0.5

li = []
lj = []

fid = open('plant.dat','w')
for i in range(1,n+1):
    for j in range(1,n+1):
        x = random()
        if x<p:
            li.append(i)
            lj.append(j)

            print>>fid,i,j
            print (i,j),'is',1
        else:
            print (i,j),'is',0
        print (i,j)
        print (p,x,n),'and',n*n*p,li,lj
这是我的gnuplot“plant.dat”文件的绘图:

在上图中,很明显,火势会上升到一定程度并停止,留下许多活树

我只想要那棵活树的坐标,然后画出来

对于上面显示的特定输入图,包含剩余活树的最终图应如下所示:

import matplotlib.pyplot as plt
image = forest_mat
row_labels = range(n)
plt.matshow(image)
plt.show()


部分擦除的点被触发,不应该在那里。

这是一个很好的例子,说明递归函数可以相对容易地解决难题。但首先我想用numpy矩阵来表示问题,而不是索引向量,同时保持大部分代码的完整性。这是您的第二个代码片段,其中我表示整个森林,0.5表示树,1表示火

print 'Now we are firing'
lif=[]
ljf=[]
fid1 = open('fire.dat','w')
for b in range(len(lj)):
    if lj[b] == 1:
        print 'We fire here',(li[b],lj[b])
        print>>fid1,li[b],lj[b]
        lif.append(li[b])
        ljf.append(lj[b])

import numpy as np
forest_mat = np.zeros([n,n])
coords = zip(li,lj)
for coord in coords:
    forest_mat[coord[0]-1,coord[1]-1] = 0.5

coords = zip(lif,ljf)
for coord in coords:
    forest_mat[coord[0]-1,coord[1]-1] = 1

forest_mat = np.flipud(forest_mat.transpose())
现在我将定义一个函数fire_trees,它通过将相邻树的值设置为1来递归地激发相邻树。我们对第一行中的每一棵树都这样做,因为它们之前都被点燃了

def fire_trees(matrix,ij):
    if ((0 <= ij[0]) and (ij[0] < len(matrix)) and (0 <= ij[1]) and (ij[1] < len(matrix)))==False:
        print "out of bounds"
        return matrix

    if matrix[ij[0],ij[1]]==0.5:

        print "Fire this tree:", ij[0],ij[1]
        matrix[ij[0],ij[1]] = 1

        matrix = fire_trees(matrix,(ij[0]-1,ij[1]))
        matrix = fire_trees(matrix,(ij[0]+1,ij[1]))
        matrix = fire_trees(matrix,(ij[0],ij[1]-1))
        matrix = fire_trees(matrix,(ij[0],ij[1]+1))

    print "No more trees to fire."
    return matrix

for i,j in enumerate(forest_mat[n-1,]):
    if j==1:
        #fire adjacent trees
        forest_mat = fire_trees(forest_mat,(n-2,i))

对不起,您的问题是什么?你的代码有什么问题?错误(提供完整的回溯)?意外输出(提供输入以及预期和实际输出)?@jornsharpe在上面的代码中,我想要绘制第二幅图像的输出点。从我上面的代码来看,它没有显示任何错误,但是文件'fire'dat'中的绘图不是这样的。你说的“输出点”是什么意思?你不能在“火”之后绘制网格,而在“火”之前绘制网格吗?@jornsharpe这里的输出点,我指的是像(1,3)这样的坐标,它还没有被点燃,并且仍然存在。。。我已经绘制了gnuplot中日期文件'plant.dat'中的第一个,这与gnuplot有关吗?你必须正确使用算法。
plt.matshow()
nice!但愿我早就知道了。
import matplotlib.pyplot as plt
image = forest_mat
row_labels = range(n)
plt.matshow(image)
plt.show()