【问题标题】:Repeat each element of a matrix in as a block into a new matrix [duplicate]将矩阵中的每个元素作为一个块重复到一个新矩阵中[重复]
【发布时间】:2018-09-14 20:28:32
【问题描述】:

在 Matlab 中,有一个命令 repelem,其工作原理如下(参见https://www.mathworks.com/help/matlab/ref/repelem.html#buocbhj-2):

例如:创建一个矩阵并将每个元素重复到一个新矩阵的 3×2 块中。

A = [1 2; 3 4]

B = repelem(A,3,2)

A = (2×2)
     1     2
     3     4

B = (6×4)
     1     1     2     2
     1     1     2     2
     1     1     2     2
     3     3     4     4
     3     3     4     4
     3     3     4     4

在 Numpy 中做同样事情的最佳方法是什么?

A = np.arange(1,5).reshape((2,2))
B = ...

【问题讨论】:

    标签: python matlab numpy


    【解决方案1】:

    你可以链接np.repeat指定axis

    repelem = lambda a, x, y: np.repeat(np.repeat(a, x, axis=0), y, axis=1)
    # same as repelem  = lambda a, x, y: a.repeat(x, 0).repeat(y, 1)
    

    只要打电话

    >>> a = np.array([[1,2], [3,4]])
    >>> repelem(a, 3, 2)
    
    array([[1, 1, 2, 2],
           [1, 1, 2, 2],
           [1, 1, 2, 2],
           [3, 3, 4, 4],
           [3, 3, 4, 4],
           [3, 3, 4, 4]])
    

    【讨论】:

      【解决方案2】:

      由于您没有更改任何元素,numpy.broadcast_to 在这里是一个完美的解决方案。它允许我们以非常快速(且内存高效)的方式返回与所需重复次数匹配的视图:

      def broadcast_tile(arr, h, w):
          x, y = a.shape
          m, n = x * h, y * w
          return np.broadcast_to(
              a.reshape(x, m//(h*x), y, n//(w*y)), (m//h, h, n//w, w)
          ).reshape(m, n)
      
      broadcast_tile(a, 3, 2)
      

      array([[1, 1, 2, 2],
             [1, 1, 2, 2],
             [1, 1, 2, 2],
             [3, 3, 4, 4],
             [3, 3, 4, 4],
             [3, 3, 4, 4]])
      

      时间

      In [425]: %timeit repelem(a, 200, 200)
      770 µs ± 35.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      
      In [426]: %timeit broadcast_tile(a, 200, 200)
      57.5 µs ± 2.27 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-21
        • 2018-09-20
        • 2011-09-29
        • 2021-02-15
        • 1970-01-01
        • 2012-12-11
        • 2019-04-13
        相关资源
        最近更新 更多