问题描述
我有一个矩形范围 [[left,bottom],[right,top]] 和一个初始点 [x,y]。我想用初始点所在的等边点网格(宽度为 w)填充范围。
到目前为止,我已经通过
找到了左上角h = w * math.sqrt(3.0) / 2.0
start = np.array([right - ((right - x) % w),top - ((top - y) % h)])
我可以用
生成x和y位置x_in_row = np.arange(start[0],right,w)
x_in_off_row = x_in_row - w / 2.0
row_y = np.arange(start[1],bottom,-h)
现在我想将它们组合起来生成一个 n x 2 数组(n 个点)。我对 NumPy 很陌生,我知道有很多方法可以优雅地组合数组,但我很难考虑用于每种目的的维度和正确的函数。是否有一个很好的功能序列/组合来实现这一点?
解决方法
x_values = np.arange(start[0],right,w)
y_values = np.arange(start[1],bottom,-h)
points = np.c_[tuple(np.ravel(mesh) for mesh in np.meshgrid(x_values,y_values))]
虚拟数据示例
>>> x_values = [1,2,3]
>>> y_values = [4,5,6]
>>> np.c_[tuple(np.ravel(mesh) for mesh in np.meshgrid(x_values,y_values))]
array([[1,4],[2,[3,[1,5],6],6]])
,
要为每个维度生成值的范围,请定义以下函数:
def getRng(rngStart,rngStop,step,start):
wrk = np.arange(rngStart,step) - start
shft = wrk[wrk < 0][-1]
return np.arange(rngStart - shft,step)
为了测试它,我假设了以下数据:
left,bottom = 0,0
right,top = 3,2
x,y = 0.4,0.12 # Starting point
w = 0.25; h = 0.3 # Step in x / y axis
然后我为两个轴生成了范围:
rngX = getRng(left,w,x)
rngY = getRng(bottom,top,h,y)
得到:
array([0.15,0.4,0.65,0.9,1.15,1.4,1.65,1.9,2.15,2.4,2.65,2.9 ])
array([0.12,0.42,0.72,1.02,1.32,1.62,1.92])
并生成预期结果(点列表),您可以运行:
result = np.transpose([np.tile(rngX,rngY.size),np.repeat(rngY,rngX.size)])
它的初始部分是:
array([[0.15,0.12],[0.4,[0.65,[0.9,[1.15,[1.4,[1.65,[1.9,[2.15,[2.4,[2.65,[2.9,
然后按照类似的“部分”获取来自 rngY 的其他值。
编辑
生成最终结果的另一个更简洁的解决方案是:
result2 = np.array(np.meshgrid(rngX,rngY)).T.reshape(-1,2)
(点的顺序不同,但在我看来并不重要)。