“NumPy-est”生成等边网格的方法

问题描述

我有一个矩形范围 [[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)

(点的顺序不同,但在我看来并不重要)。