【问题标题】:Simplest way to sum two dimensions? (Python)求和二维的最简单方法? (Python)
【发布时间】:2014-05-17 07:32:19
【问题描述】:

我需要帮助来对两个维度求和。

假设我有 [[0,1,2],[3,4,5]] 作为我的维度,将这些数字相加将返回 int 15。

   def sum_dimensions(x):
       x = []
       answer = sum(x)
       return int(x)

感谢指出我在代码中的错误。

【问题讨论】:

    标签: python list int sum dimension


    【解决方案1】:

    让我们稍微了解一下。我在我的机器上使用了以下数据集:

    data = list(list(range(100000)) for i in range(1000))
    

    我有以下结果:

    In [13]: %%timeit                                             
    sum(sum(ele) for ele in data)
       ....: 
    1 loops, best of 3: 1.15 s per loop
    
    In [14]: %%timeit                                             
    sum([sum([item for item in ele]) for ele in data])
       ....: 
    1 loops, best of 3: 3.78 s per loop
    
    
    In [15]: %%timeit                                             
    sum(j for i in data for j in i)
       ....: 
    1 loops, best of 3: 4.92 s per loop
    
    In [16]: %%timeit                                             
    sum(itertools.chain.from_iterable(data))
       ....: 
    1 loops, best of 3: 1.61 s per loop
    
    In [18]: %%timeit
    sum(map(sum, data))
       ....: 
    1 loops, best of 3: 1.16 s per loop
    

    但是对于小型数据集,itertools 变体比sum(sum 变体快 2 倍。 sum(map(sum 似乎完全映射到 sum(sum(ele) for ele in data) 构造

    【讨论】:

    • 这是关于过早优化的问题吗?
    • 嘿,虽然生成器表达式的总和会比这更有效。很高兴知道!
    • @Hyperboreus 否。但是这项任务非常简单,并且允许具有相同代码复杂度的多个解决方案。因此,值得研究它们的比较方式,不是吗?例如,看看j for i in data for j in i 构造的性能有多糟糕,这很有趣,我没想到会这样。
    【解决方案2】:

    它是 Python,而不是 C。

    ar = [[0,1,2],[3,4,5]]
    result = sum ( [sum(block) for block in ar] )
    

    【讨论】:

      【解决方案3】:

      如果你在做其他线性代数,可能值得考虑numpy

      import numpy as np
      
      x = np.array( [[0,1,2],[3,4,5]] )
      print np.sum(x)
      

      【讨论】:

      • 我不喜欢使用 Numpy。忘了说!
      【解决方案4】:

      这就是你要找的:

      data = [[0,1,2],[3,4,5]]
      sum([sum([item for item in ele]) for ele in data])
      15
      

      正如@filmor 所指出的,这可以简化为:

      data = [[0,1,2],[3,4,5]]
      sum([sum(ele) for ele in data])
      15
      

      就您的代码而言,如果您将[[0,1,2],[3,4,5]] 作为x 传递给函数:

      answer = sum(x)
      

      会抛出一个TypeError。以下

      return int(x)
      

      也没有意义。使您的代码工作的方法是:

      def sum_dimensions(x):
         answer = sum(x)
         return answer
      
      data = [[0,1,2],[3,4,5]]
      total_sum = 0
      for sub_list in data:
          total_sum += sum_dimensions(sub_list)
      

      【讨论】:

      • sum([item for item in ele]) 可以写成sum(ele)
      • sum(j for i in data for j in i)
      • 那就更好了,是的:)
      • 这会占用大阵列上的额外资源。当性能可能成为问题时,您应该寻找方法以调用 mathitertools 来替换 Python 循环。
      • 究竟是什么? M4rtini 的解决方案?
      【解决方案5】:

      试试这个,

      >>>sum([sum(i) for i in [[0,1,2],[3,4,5]]])
      

      输出:

      15
      

      【讨论】:

      • 非常感谢您的回复。
      【解决方案6】:

      你可以试试这个:

      >>> l = [[0,1,2],[3,4,5]]
      >>> 
      >>> sum(a for v in l for a in v)
      15
      

      【讨论】:

        【解决方案7】:

        也可以使用map()sum() 来完成:

        a = [[0,1,2],[3,4,5]]
        sum(map(sum, a)) #15
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-29
          • 2010-10-27
          • 1970-01-01
          相关资源
          最近更新 更多