【问题标题】:Python: Concatenate (or clone) a numpy array N timesPython:连接(或克隆)一个numpy数组N次
【发布时间】:2014-05-03 06:39:19
【问题描述】:

我想通过克隆 Mx1 ndarray N 次来创建一个 MxN numpy 数组。有没有一种有效的 Pythonic 方式来代替循环?

顺便说一句,以下方式对我不起作用(X 是我的 Mx1 数组):

   numpy.concatenate((X, numpy.tile(X,N)))

因为它创建了一个 [M*N,1] 数组而不是 [M,N]

【问题讨论】:

  • tile(X,N) 会做到的。
  • (num)Pythonic 的方式不是这样做,而是使用broadcasting 而不是tilerepmat 等。
  • 您可能不需要展开它。例如,如果它与 [M,N] 或 [1,N] 矩阵相加或相乘,则结果将为 [M,N]。 numpy 为您广播。事实上,您可以使用它来扩展数组:X + np.zeros(N).

标签: python arrays numpy append concatenation


【解决方案1】:

你很亲密,你想使用np.tile,但是像这样:

a = np.array([0,1,2])
np.tile(a,(3,1))

结果:

array([[0, 1, 2],
   [0, 1, 2],
   [0, 1, 2]])

如果您致电 np.tile(a,3),您将得到 concatenate 的行为,就像您看到的一样

array([0, 1, 2, 0, 1, 2, 0, 1, 2])

http://docs.scipy.org/doc/numpy/reference/generated/numpy.tile.html

【讨论】:

    【解决方案2】:

    你可以使用vstack:

    numpy.vstack([X]*N)
    

    例如

        >>> import numpy as np
        >>> X = np.array([1,2,3,4])
        >>> N = 7
        >>> np.vstack([X]*N)
        array([[1, 2, 3, 4],
               [1, 2, 3, 4],
               [1, 2, 3, 4],
               [1, 2, 3, 4],
               [1, 2, 3, 4],
               [1, 2, 3, 4],
               [1, 2, 3, 4],
               [1, 2, 3, 4],
               [1, 2, 3, 4]])
    

    【讨论】:

    • vstack 在我们需要重复的多维数组时起作用,例如:a=[[1,2,3,4][5,6,7,8]] 变为 [[1, 2,3,4][5,6,7,8][1,2,3,4][5,6,7,8]] 与 np.vstack([a]*2)。其他方法让你 [[1,2,3,4][1,2,3,4][5,6,7,8][5,6,7,8]]
    • 是否还需要vstack?为什么不只是np.array([X] * N)
    【解决方案3】:

    你试过了吗:

    n = 5
    X = numpy.array([1,2,3,4])
    Y = numpy.array([X for _ in xrange(n)])
    print Y
    Y[0][1] = 10
    print Y
    

    打印:

    [[1 2 3 4]
     [1 2 3 4]
     [1 2 3 4]
     [1 2 3 4]
     [1 2 3 4]]
    
    [[ 1 10  3  4]
     [ 1  2  3  4]
     [ 1  2  3  4]
     [ 1  2  3  4]
     [ 1  2  3  4]]
    

    【讨论】:

      【解决方案4】:

      np.vstack 的替代方法是 np.array 以这种方式使用(@bluenote10 在评论中也提到过):

      x = np.arange([-3,4]) # array([-3, -2, -1,  0,  1,  2,  3])
      N = 3 # number of time you want the array repeated
      X0 = np.array([x] * N)
      

      给予:

      array([[-3, -2, -1,  0,  1,  2,  3],
             [-3, -2, -1,  0,  1,  2,  3],
             [-3, -2, -1,  0,  1,  2,  3]])
      

      您也可以通过这种方式使用meshgrid(当然写的时间更长,而且有点牵强,但您还有另一种可能性,您可能会在此过程中学到新东西):

      X1,_ = np.meshgrid(a,np.empty([N]))
      

      >>> X1 显示:

      array([[-3, -2, -1,  0,  1,  2,  3],
             [-3, -2, -1,  0,  1,  2,  3],
             [-3, -2, -1,  0,  1,  2,  3]])
      

      检查所有这些是否等效:

      • meshgrid 和 np.array 方法

        X0 == X1

      结果:

      array([[ True,  True,  True,  True,  True,  True,  True],
             [ True,  True,  True,  True,  True,  True,  True],
             [ True,  True,  True,  True,  True,  True,  True]])
      
      • np.array 和 np.vstack 方法

        X0 == np.vstack([x] * 3)

      结果:

      array([[ True,  True,  True,  True,  True,  True,  True],
             [ True,  True,  True,  True,  True,  True,  True],
             [ True,  True,  True,  True,  True,  True,  True]])
      
      • np.array 和 np.tile 方法

        X0 == np.tile(x,(N,1))

      结果:

      array([[ True,  True,  True,  True,  True,  True,  True],
             [ True,  True,  True,  True,  True,  True,  True],
             [ True,  True,  True,  True,  True,  True,  True]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-21
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 2013-10-31
        • 2017-05-27
        • 2012-04-04
        相关资源
        最近更新 更多