生成等边网格的“NumPyest”方法

2024-09-28 22:02:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个矩形范围[[左,下],[右,上]]和一个初始点[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)

现在我想把这些结合起来,生成一个nx2数组(由n个点组成)。我是NumPy的新手,我知道有很多方法可以优雅地组合阵列,但我很难考虑每个用途的尺寸和正确的函数。是否有一个很好的序列/功能组合来实现这一点


Tags: inright宽度topnpmathsqrtarray
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)

(分数的顺序不同,但我认为这并不重要)

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]])

相关问题 更多 >