我正在尝试创建代表栅格扫描模式的xy位置列表,如下所示:
简而言之,我正在使用嵌套循环和if else语句,但是它变得凌乱。有没有简单的方法来生成固定步长的位置列表?
最佳答案
结合使用Numpy和普通Python的一种可能解决方案:
from pylab import *
# define some grids
xgrid = arange(20, 31)
ygrid = arange(10, 16)
xscan = []
yscan = []
for i, yi in enumerate(ygrid):
xscan.append(xgrid[::(-1)**i]) # reverse when i is odd
yscan.append(ones_like(xgrid) * yi)
# squeeze lists together to vectors
xscan = concatenate(xscan)
yscan = concatenate(yscan)
# quick plot
plot(xscan, yscan, '.-')
axis([19, 31, 9, 16])
show()
该方法的工作方式是为x和y定义2个空列表,您一次向其添加一条扫描线。对于x坐标,您还可以选择一条正向和一条反向线(
xgrid[::1]
代表前进,xgrid[::-1]
代表反向,+1
和-1
交替通过(-1)**i
获得),而y-坐标,则必须为每个x坐标重复一个y值。最后,必须将向量列表concatenate合并为一个向量。使用list-comprehension和
repeat
,无需任何for循环即可实现相同的效果,如下所示:xscan = concatenate([xgrid[::(-1)**i] for i in range(len(ygrid))])
yscan = repeat(ygrid, len(xgrid))
产生的扫描模式: