1

我有一个 MxNx2 二维点数组,其中每个点代表网格的测量属性的中心。图形表示如下,白点是位置:

在此处输入图像描述

点结构是这样的(形状:MxNx2):

[[[xij, yij], [xij, yij], ...]],
 [[xij, yij], [xij, yij], ...]],
 [[xij, yij], [xij, yij], ...]],
 [ ..., ...., ............... ],
 [[xij, yij], [xij, yij], ...]]]

所需的输出将是这样的:

[[[x1, x2], [y1, y2]],
 [[x1, x2], [y1, y2]],
 ....................,
 [[x1, x2], [y1, y2]]

这样我就可以像这样一个一个地绘制每个段(使用每对 x,y 位置):

在此处输入图像描述

我尝试过类似的东西:

segments = []
for row in xrange(a.shape[0] - 1):
    for col in xrange(a.shape[1] - 1):
        here = a[row, col]
        below = a[row+1, col]
        right = a[row, col+1]
        segments.extend(((here, right), (here, below)))

但这会使右侧和底部边缘未被覆盖。另外,我怀疑这是一种有点“愚蠢”、非矢量化、蛮力的做法,这似乎是一个很常见的问题,可能有一个网格创建功能。

欢迎任何建议!

4

2 回答 2

2

可以通过分别为轴添加段来完成:

for row in xrange(a.shape[0]):
    segments.extend( (a[row, col], a[row, col+1]) for col in xrange(a.shape[1] - 1) )
for col in xrange(a.shape[1]):
    segments.extend( (a[row, col], a[row+1, col]) for row in xrange(a.shape[0] - 1) )

或与zip()

s1 = (a.shape[0]*(a.shape[1]-1), 2)
s2 = (a.shape[1]*(a.shape[0]-1), 2)
segments = list(zip( a[:,:-1].reshape(s1), a[:,1:].reshape(s1))) + \
           list(zip( a[:-1,:].reshape(s2), a[1:,:].reshape(s2)))
于 2012-12-03T19:00:47.630 回答
1

如果有人感兴趣,我修改了我正在使用的代码,它现在可以工作了,也许不是那么优雅或高效,但是......

pairs = []
for row in xrange(pointarray.shape[0]):
    for col in xrange(pointarray.shape[1]):
        here = pointarray[row, col]
        if row < pointarray.shape[0]-1:
            below = pointarray[row+1, col]
            pairs.append((here, below))
        if col < pointarray.shape[1]-1:
            right = pointarray[row, col+1]
            pairs.append((here, right))
于 2012-12-03T18:48:42.063 回答