如何在python中迭代或处理网格或坐标
我已经在nxn的网格中创建了一个带有随机数的森林。为了创建森林,我使用了每个网格和一个随机数来种植一棵树。并将种植坐标存储在列表中,x轴为如何在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
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()