【问题标题】:Numpy equivalent of zip with rolled 2D array带有滚动二维数组的 zip 的 Numpy 等效项
【发布时间】:2017-02-23 04:29:23
【问题描述】:

我有一个二维坐标列表作为 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]]])

如何使用 numpy 函数而不转换为 Python 列表以获得此结果?

到目前为止,我使用 NumPy 进行的尝试都失败了,例如:

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

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

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

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

【问题讨论】:

    标签: python numpy coordinates


    【解决方案1】:

    我不太明白为什么这是您想要的输出,但这是您想要获得的 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 的 axes 选项。输出的意思是“从 (2,3) 到 (0,1) 画线,从 (0,1) 到 (1,2) 画线等”。如果 x 包含多边形的所有点,这将绘制多边形。
    • 我将轴传递给转置,而不是 dstack。
    • 哦...这就是我错过它的原因 :-) 谢谢。当然,我从中学到了一些东西!
    【解决方案2】:

    这是一种创建此类滚动索引然后编制索引的方法 -

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2020-09-25
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多