【问题标题】:Create a "wrapped" ndarray from a given array从给定的数组创建一个“包装的”ndarray
【发布时间】:2015-05-03 18:20:11
【问题描述】:

我正在尝试通过使用滚动的给定数组作为指定行维度的二维数组的行来从数组创建二维数组。例如:

r = np.array([1,2,3,4])

想要一个 3 行的矩阵(使用 r)作为

[[2,3,4,1],
 [1,2,3,4],
 [4,1,2,3]]

我想我有一个想法,通过使用 numpy.roll 和 for 循环定义一个函数,但我试图避免这种情况,因为我的 2D 数组将非常大。如果可能的话,我希望能够向后滚动。

有没有办法使用 numpy 函数来代替?对此的任何建议表示赞赏。

【问题讨论】:

  • 你可以试试random.shuffle
  • 好吧,我应该提到它应该有一些顺序。如果所需的矩阵有 n 行,那么滚动的序列必须从 -1、0、...、n-1 开始,不包括 n-1。
  • 你不能用循环卷积来做到这一点吗?

标签: python arrays numpy


【解决方案1】:

如果使用scipy 是一个选项,您可以使用scipy.linalg.circulant。您仍然需要将参数调整为 circulant 以获得您想要的结果,因为 circulant 只是将给定的一维参数作为正方形 circulant matrix 的第一列。

例如:

In [25]: from scipy.linalg import circulant

In [26]: r = np.array([1,2,3,4])

这是circulant 提供的内容:

In [27]: circulant(r)
Out[27]: 
array([[1, 4, 3, 2],
       [2, 1, 4, 3],
       [3, 2, 1, 4],
       [4, 3, 2, 1]])

np.roll() 的帮助下,您可以获得所需的数组:

In [28]: circulant(np.roll(r, -1)).T[:-1]
Out[28]: 
array([[2, 3, 4, 1],
       [1, 2, 3, 4],
       [4, 1, 2, 3]])

或者:

In [29]: circulant(np.roll(r[::-1], -1))[1:]
Out[29]: 
array([[2, 3, 4, 1],
       [1, 2, 3, 4],
       [4, 1, 2, 3]])

【讨论】:

    【解决方案2】:

    这是问题的一个解决方案。它使用 numpy 的 vstack 将行组合成一个数组。虽然它可能不是最有效的(我不知道res = np.vstack((res, r)) 的效率)

    import numpy as np
    
    def main():
        r = np.array([1,2,3,4])
        x = [i for i in range(1, len(r))] + [0]           # Forwards
        # x = [len(r)-1] + [i for i in range(len(r)-1)]     # Backwards
        r = r[x]
        res = r
        for c in range(2):
            r = r[x]
            res = np.vstack((res, r))
        print res
        return 0
    
    if __name__ == '__main__':
        main()
    

    它产生:

    [[2 3 4 1]     'Forwards'
     [3 4 1 2]
     [4 1 2 3]]
    
    [[4 1 2 3]     'Backwards'
     [3 4 1 2]
     [2 3 4 1]]
    

    要更改顺序,只需更改x = 行。

    【讨论】:

      【解决方案3】:

      这是一个使用列表索引的简单解决方案。

      r = [1, 2, 3, 4] # note: a list, so we can easily concatenate
      result = np.array([r[i:] + r[:i] for i in range(1, len(r))])
      
      array([[2, 3, 4, 1],
             [3, 4, 1, 2],
             [4, 1, 2, 3]])
      

      这非常灵活,因为索引对于i 的负值仍然有意义。所以你只需要弄乱range 以获得所需的开始和停止行以及方向。

      特别是要获得您想要的确切结果:

      np.array([r[i:] + r[:i] for i in range(1, -len(r) + 2, -1)])
      
      array([[2, 3, 4, 1],
             [1, 2, 3, 4],
             [4, 1, 2, 3]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        • 2019-05-14
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多