【问题标题】:Python creating multiple array from a basis array [closed]Python从基础数组创建多个数组[关闭]
【发布时间】:2019-08-15 02:40:51
【问题描述】:

给定一个包含 n 个元素的数组[x1 x2 x3 ... xn],希望生成以下包含 K 行的数组:

[[x1   x2   x3   ... xn],
 [x1^2 x2^2 x3^2 ... xn^2],
 [x1^3 x2^3 x3^3 ... xn^3],
 ...,
 [x1^K x2^K x3^K ... xn^K]].

如何有效地做到这一点?

【问题讨论】:

  • 您能否展示您的尝试,以便我们建议如何优化您的解决方案
  • 所以你有一个数组[x1 x2 x3 ... xn],你想提升到[1,2,3,...k]的权力。我认为 ^ 是一种力量,通常在 Python 中表示为 **。

标签: python numpy ipython spyder


【解决方案1】:

你可以使用numpy.power.outer:

>>> K=9
>>> numpy.power.outer(numpy.array([1, 4, 5]), numpy.arange(1, K+1)).T
array([[      1,       4,       5],
       [      1,      16,      25],
       [      1,      64,     125],
       [      1,     256,     625],
       [      1,    1024,    3125],
       [      1,    4096,   15625],
       [      1,   16384,   78125],
       [      1,   65536,  390625],
       [      1,  262144, 1953125]])

【讨论】:

    【解决方案2】:

    power.outer 的变体,使用 ** 运算符和广播:

    In [223]: np.arange(1,5)**np.arange(1,4)[:,None]                                
    Out[223]: 
    array([[ 1,  2,  3,  4],
           [ 1,  4,  9, 16],
           [ 1,  8, 27, 64]])
    

    【讨论】:

      【解决方案3】:

      您正在查看时间复杂度为 O(kn) 的算法:

      def build_value_lists(base_numbers, max_exponent):
          value_lists = []
          for k in range(1, max_exponent+1):
              values = []
              for x in base_numbers:
                  values.append(x**k)
              value_lists.append(values)
      
          return value_lists
      
      base_numbers = [1, 2, 3, 4, 5];
      max_exponent = 3
      
      print build_value_lists(base_numbers, max_exponent)
      

      由于您需要一个包含所有值的 Python 列表,因此很难使该算法更加高效。如果您只是希望代码运行得更快,请注意线程不太可能提高性能。 Multiprocessing 将是您最好的选择。这个想法是创建一个工人池,每个工人计算单个列表的结果k。随着每个工作人员完成其任务,结果可以附加到包含列表中。

      【讨论】:

        【解决方案4】:

        您可以使用PolynomialFeatures

        测试栏:

        import numpy as np
        col = np.linspace(1, 5, 5).reshape((-1, 1))
        

        变换:

        from sklearn.preprocessing import PolynomialFeatures
        
        poly = PolynomialFeatures(degree=4, include_bias=False)
        poly.fit_transform(col).T
        
        > array([[  1.,   2.,   3.,   4.,   5.],
                 [  1.,   4.,   9.,  16.,  25.],
                 [  1.,   8.,  27.,  64., 125.],
                 [  1.,  16.,  81., 256., 625.]])
        

        【讨论】:

          【解决方案5】:

          你可以制作一个矩阵重复数组 K 次,然后使用 numpy 的 cumprod()

          result = np.cumprod([arr,]*k,axis=0)
          

          如果您不使用 numpy,则常规 python 列表可以使用 itertools 中的累积来执行相同操作。

          result = accumulate( ([arr]*k), func=lambda a,b: [x*y for x,y in zip(a,b)])
          

          这将比使用 numpy 慢得多。

          注意:accumulate 返回一个迭代器,你可以用list(result)把它变成一个列表@

          【讨论】:

            【解决方案6】:

            这是一个很有名的矩阵,叫做Vandermonde matrix。 Numpy 包中有一个特殊的函数来获取这个矩阵:

            import numpy as np 
            np.fliplr(np.vander([2,3,4], 5)).T
            
            
            > array([[  1,   1,   1],
                   [  2,   3,   4],
                   [  4,   9,  16],
                   [  8,  27,  64],
                   [ 16,  81, 256]])
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-08-20
              相关资源
              最近更新 更多