我有一个MxNx2 2D点阵列,其中每个点代表网格测量属性的中心。下面是图形表示,白点是位置:
点结构是这样的(形状: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)))
但是这会留下右边和底边。此外,我怀疑这是一种有点“愚蠢”,非矢量化,蛮力的方式,它似乎是一个常见的问题,可能有一个网格创建功能。
欢迎任何建议!
答案 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))