【发布时间】:2014-01-02 06:12:45
【问题描述】:
我正在尝试创建一个代表光栅扫描模式的 xy 位置列表,如下所示:
简单地说,我正在使用嵌套循环和 if else 语句,但它变得混乱。有没有一种简单的方法可以生成一个固定步长的位置列表?
【问题讨论】:
我正在尝试创建一个代表光栅扫描模式的 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))
生成的扫描模式:
【讨论】: