【问题标题】:Repeating array with transformation具有变换的重复数组
【发布时间】:2019-05-21 05:42:00
【问题描述】:

如何重复以下示例序列:

l = np.array([3,4,5,6,7])

最多n 次,每次重复时值加倍。所以对于n=3

[3, 4, 5, 6, 7, 6,  8, 10, 12, 14, 12, 16, 20, 24, 28]

有没有一种简单的方法可以避免numpy 的循环?

【问题讨论】:

  • 循环是你最好的选择,你不能使用循环有什么原因吗?

标签: python arrays list numpy


【解决方案1】:

numpy.outer + numpy.ndarray.ravel:

>>> a = np.array([3,4,5,6,7])                                                                                          
>>> n = 3                                                                                                              
>>> factors = 2**np.arange(n)                                                                                          
>>> np.outer(factors, a).ravel()                                                                                       
array([ 3,  4,  5,  6,  7,  6,  8, 10, 12, 14, 12, 16, 20, 24, 28])

详情:

>>> factors                                                                                                            
array([1, 2, 4])
>>> np.outer(factors, a)                                                                                               
array([[ 3,  4,  5,  6,  7], # 1*a
       [ 6,  8, 10, 12, 14], # 2*a
       [12, 16, 20, 24, 28]]) # 4*a

【讨论】:

    【解决方案2】:

    您可以使用 2 的幂作为乘法因子来使用连接和列表推导。这里3是你需要的重复次数。

    l = np.array([3,4,5,6,7])
    final = np.concatenate([l*2**(i) for i in range(3)])
    print (final)
    
    array([ 3,  4,  5,  6,  7,  6,  8, 10, 12, 14, 12, 16, 20, 24, 28])
    

    【讨论】:

      【解决方案3】:

      这是一种方法:

      >>> (l * [[1], [2], [4]]).flatten()
      array([ 3,  4,  5,  6,  7,  6,  8, 10, 12, 14, 12, 16, 20, 24, 28])
      

      (仅当您想要多个输入时才有效。)

      【讨论】:

        【解决方案4】:

        你可以这样做:

        import numpy as np
        
        l = np.array([3, 4, 5, 6, 7])
        
        rows = np.tile(l, 3).reshape(-1, len(l)) * np.power(2, np.arange(3)).reshape(-1, 1)
        print(rows.flatten())
        

        输出

        [ 3  4  5  6  7  6  8 10 12 14 12 16 20 24 28]
        

        【讨论】:

          【解决方案5】:

          您可以将np.powernp.ndarray.ravel 一起使用:

          A = np.array([3,4,5,6,7])
          
          res = (A * np.power(2, np.arange(3))[:, None]).ravel()
          
          print(res)
          
          array([ 3,  4,  5,  6,  7,  6,  8, 10, 12, 14, 12, 16, 20, 24, 28])
          

          【讨论】:

            【解决方案6】:

            您可以循环n,并每次连接一个新列表:

            l = [3,4,5,6,7]
            n = 3
            new_l = []
            for i in range(n):
                new_l += [j*2**i for j in l]
            new_l = np.array(new_l)
            

            输出

            array([3, 4, 5, 6, 7, 6, 8, 10, 12, 14, 12, 16, 20, 24, 28])
            

            【讨论】:

              【解决方案7】:

              您可以在纯 python 中使用列表推导来做到这一点:

              l = [3,4,5,6,7]
              
              n     = 3
              mult  = [1 * 2**i for i in range(n)]
              final = list([x*m for m in mult for x in l])
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-09-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-01-13
                • 1970-01-01
                • 2021-10-24
                • 1970-01-01
                相关资源
                最近更新 更多