Python Numpy等效于zip和滚动2D数组
我有一个二维坐标列表作为NumPy数组,例如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:]) +
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。哦。。。这就是我错过它的原因:-)谢谢。当然,我从中学到了一些东西!