Python Numpy等效于zip和滚动2D数组

Python Numpy等效于zip和滚动2D数组,python,numpy,coordinates,Python,Numpy,Coordinates,我有一个二维坐标列表作为NumPy数组,例如 x = np.asarray([[0, 1], [1, 2], [2, 3]]) 形状(3,2) 现在,我想用np.roll(x,1)压缩这个数组,以获得坐标对,在坐标对之间画线(包括从最后一个元素到第一个元素的线)。线的顺序无关紧要 我已经找到了一个使用标准Python zip的解决方案: >>> np.asarray(list(zip(list(x[-1:]) +

我有一个二维坐标列表作为NumPy数组,例如

x = np.asarray([[0, 1],
                [1, 2],
                [2, 3]])
形状
(3,2)

现在,我想用
np.roll(x,1)
压缩这个数组,以获得坐标对,在坐标对之间画线(包括从最后一个元素到第一个元素的线)。线的顺序无关紧要

我已经找到了一个使用标准Python zip的解决方案:

>>> np.asarray(list(zip(list(x[-1:]) + list(x[:-1]), x)))
array([[[2, 3],
        [0, 1]],
       [[0, 1],
        [1, 2]],
       [[1, 2],
        [2, 3]]])
如何在不转换为Python列表的情况下使用numpy函数来获得此结果

到目前为止,我试图用NumPy来做这件事的尝试失败得很惨,例如:

>>> np.dstack([x, np.roll(x, 1)])
array([[[0, 3],
        [1, 0]],

       [[1, 1],
        [2, 1]],

       [[2, 2],
        [3, 2]]])

编辑:这不是试图创建x与任何其他数组的组合,因此建议的副本不是副本。

我不太明白为什么这是您想要的输出,但这是您尝试获得的dstack版本:

>>> np.transpose(np.dstack([np.roll(x, 1, axis=0), x]), axes=(0,2,1))
array([[[2, 3],
        [0, 1]],

       [[0, 1],
        [1, 2]],

       [[1, 2],
        [2, 3]]])

我不太明白为什么这是您想要的输出,但这是您试图获得的dstack版本:

>>> np.transpose(np.dstack([np.roll(x, 1, axis=0), x]), axes=(0,2,1))
array([[[2, 3],
        [0, 1]],

       [[0, 1],
        [1, 2]],

       [[1, 2],
        [2, 3]]])

这里有一种创建这样的滚动索引然后索引的方法-

In [18]: x            # Input array
Out[18]: 
array([[0, 1],
       [1, 2],
       [2, 3]])

In [19]: n = x.shape[0]

In [20]: x[np.mod(np.arange(n)[:,None] + [n-1,0],n)]
Out[20]: 
array([[[2, 3],
        [0, 1]],

       [[0, 1],
        [1, 2]],

       [[1, 2],
        [2, 3]]])

这里有一种创建这样的滚动索引然后索引的方法-

In [18]: x            # Input array
Out[18]: 
array([[0, 1],
       [1, 2],
       [2, 3]])

In [19]: n = x.shape[0]

In [20]: x[np.mod(np.arange(n)[:,None] + [n-1,0],n)]
Out[20]: 
array([[[2, 3],
        [0, 1]],

       [[0, 1],
        [1, 2]],

       [[1, 2],
        [2, 3]]])

谢谢!我完全错过了dstack的
选项。输出意味着“从(2,3)到(0,1)绘制直线,从(0,1)到(1,2)绘制直线等”。如果x包含多边形的所有点,这将绘制多边形。我将轴传递到转置,而不是dstack。哦…这就是我错过它的原因:-)谢谢。当然,我从中学到了一些东西!谢谢我完全没有使用dstack的
选项。输出表示“从(2,3)到(0,1)绘制线,从(0,1)到(1,2)绘制线等”。如果x包含一个多边形的所有点,这将绘制多边形。我传递轴是为了转置,而不是dstack。哦。。。这就是我错过它的原因:-)谢谢。当然,我从中学到了一些东西!