在numpy中从2D点阵列创建矩形网格(线段列表)

时间:2012-12-03 18:05:58

标签: multidimensional-array numpy mesh

我有一个MxNx2 2D点阵列,其中每个点代表网格测量属性的中心。下面是图形表示,白点是位置:

enter image description here

点结构是这样的(形状: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位置),如下所示:

enter image description here

我尝试过类似的东西:

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

但是这会留下右边和底边。此外,我怀疑这是一种有点“愚蠢”,非矢量化,蛮力的方式,它似乎是一个常见的问题,可能有一个网格创建功能。

欢迎任何建议!

2 个答案:

答案 0 :(得分: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)))

答案 1 :(得分: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))