我正在尝试创建代表栅格扫描模式的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))


产生的扫描模式:

09-11 17:18