【问题标题】:"NumPy-est" way to generate equilateral grid“NumPy-est”生成等边网格的方式
【发布时间】:2021-01-05 17:50:22
【问题描述】:

我有一个矩形范围 [[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 还是很陌生,我知道有很多方法可以优雅地组合数组我只是很难考虑用于每个目的的维度和正确的函数。有没有很好的功能序列/组合来实现这一点?

【问题讨论】:

  • 查看meshgrid
  • 据我了解,x轴的步长是wy轴的步长是 h。由于 wh 不同,您要创建的网格是等边的。如果两个轴的步长相同,它将是等边的。
  • 糟糕,我的意思是等边三角形网格

标签: python numpy geometry numpy-ndarray


【解决方案1】:
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, 4],
       [3, 4],
       [1, 5],
       [2, 5],
       [3, 5],
       [1, 6],
       [2, 6],
       [3, 6]])

【讨论】:

    【解决方案2】:

    要生成每个维度的值范围,请定义以下函数:

    def getRng(rngStart, rngStop, step, start):
        wrk = np.arange(rngStart, rngStop, step) - start
        shft = wrk[wrk < 0][-1]
        return np.arange(rngStart - shft, rngStop, 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, right, 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.12],
           [0.65, 0.12],
           [0.9 , 0.12],
           [1.15, 0.12],
           [1.4 , 0.12],
           [1.65, 0.12],
           [1.9 , 0.12],
           [2.15, 0.12],
           [2.4 , 0.12],
           [2.65, 0.12],
           [2.9 , 0.12],
    

    然后按照类似的“部分”获取来自 rngY 的其他值。

    编辑

    生成最终结果的另一个更简洁的解决方案是:

    result2 = np.array(np.meshgrid(rngX, rngY)).T.reshape(-1,2)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 2012-01-03
      • 2023-03-16
      • 1970-01-01
      • 2012-12-09
      • 2015-06-05
      • 1970-01-01
      相关资源
      最近更新 更多